2022

2022年1月23日 星期日

Leetcode - Medium - 15. 3Sum - Javascript


Medium

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != ji != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

 

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]

Example 2:

Input: nums = []
Output: []

Example 3:

Input: nums = [0]
Output: []

 

Constraints:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

 


解題方向:
1. 需要先由小到大排序 array
2. 這題要透過 two point 方式解, 所以除了 a 是原點外, 要增加a左邊一個的 b, 與最右邊的 c
3. 當 array 小於 3 時就不需要比較
4. 如果排序後第一位大於 0, 也代表後面排序的數字不可能相加等於 0, 可跳過這一輪的 a
5. 如果 a 這一輪的數字與前一輪比過的數字一樣, 也可以跳過這一輪的 a
6. 相加 nums[a], nums[b], nums[c] 等於 0 就紀錄到 result, 並讓 b, c 往中間移動, 需注意 b與c下一個如果與前一個相同數字則跳過, 因為已經計算過
7. 如 nums[a], nums[b], nums[c] 不等於 0, 則判斷  nums[b] + nums[c] 是否大於或小於 -nums[a], 如果是就讓 b or c 指標往中間移動繼續下一個判斷


程式碼 :
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let result = [];
    const numsLen = nums.length;
    
    if (numsLen < 3) { return result; }
    
    nums.sort((a,b) => a-b);

    for (let a = 0; a < numsLen; a++) {
        if(nums[a] > 0){    
           break;
        }
        
        if (a > 0 && nums[a] === nums[a-1]) {
            continue;
        }
        
        let b = a + 1;
        let c = numsLen - 1;
        const temp = -(nums[a]);
        
        while (b < c) {
            if (nums[a] + nums[b] + nums[c] === 0) {
                result.push([nums[a], nums[b], nums[c]]);
            
                while(b < c && nums[b] === nums[b+1]) b++;
                while(b < c && nums[c] === nums[c-1]) c--;
                b++;
                c--;
            }
            
            const twoPointSum = nums[b] + nums[c];
            
            if (twoPointSum > temp) {
                c--;
            } else if (twoPointSum < temp) {
                b++;
            }
        }
    }
    
    
    return result;
};



執行成果:





Leetcode - Easy - 14. Longest Common Prefix - Javascript


14. Longest Common Prefix

Easy

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

 

Example 1:

Input: strs = ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: strs = ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

 

Constraints:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] consists of only lower-case English letters.



解題方向:
1. 這題主要有兩種方式
    a. 先找出所有字串最少字數, 再透過 for loop 找尋所有對應的字串 prefix 是否一致
    b. 透過遍歷所有字串, 一一比對相同的 prefix, 這邊也是透過這個方式處理

程式碼 :
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    result = ''
    
    let index = 0;
    const strsLen = strs.length;
    
    while(true) {
        let isCommon = true;
        const firstChat = strs[0][index];
    
        for (let i =0; i<strsLen; i++) {
            const currentChat = strs[i][index];
            if (!strs[i][index] || firstChat !== currentChat) {
                return result;
            }
            
        }
        
        result += firstChat;
        index++;
    } 
    return result;
};



執行成果:


2022年1月21日 星期五

Leetcode - Easy - 13. Roman to Integer - Javascript


Easy

Roman numerals are represented by seven different symbols: IVXLCD and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, 2 is written as II in Roman numeral, just two one's added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given a roman numeral, convert it to an integer.

 

Example 1:

Input: s = "III"
Output: 3
Explanation: III = 3.

Example 2:

Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 3:

Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

Constraints:

  • 1 <= s.length <= 15
  • s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M').
  • It is guaranteed that s is a valid roman numeral in the range [1, 3999].



解題方向:
1. 這邊主要是要搞懂 Roman 規則, 再擬定羅馬與數字對照表
    a. 1 ~ 3 是用 I 表示
    b. 4 ~ 8 是與 V 相關
    c. 9 ~ 10 是和 ‘X’ 相關
2. 透過優先計算前一位與下一位是否能找到數字的規則決定結果要加上多少數字
3. 如果前一位與下一位對應的數字不在 才是累計前一位的數字

程式碼 :
/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    romanDict = {
        IV: 4,
        IX: 9,
        XL: 40,
        XC: 90,
        CD: 400,
        CM: 900,
        M: 1000,
        D: 500,
        C: 100,
        L: 50,
        X: 10,
        V: 5,
        I: 1,        
    };
    
    let nextIndex = 0;
    let result = 0;
    while(nextIndex < s.length) {
        const firstChat = s[nextIndex];
        nextIndex++;
        const nextChat = s[nextIndex];
        
        if (nextChat) {
            const nextNum = romanDict[firstChat + nextChat];
            if (nextNum) {
                result += nextNum;
                nextIndex++; 
                continue;
            }
        }

        result += romanDict[firstChat];
    }
    
    return result;
};


執行成果:





高手解題:

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
     const a = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };
    
    let res=0
    
    for(let i=0;i<s.length;i++){
        res+=a[s[i]]
        
        if(a[s[i-1]]<a[s[i]]){
            res-=2*a[s[i-1]]
        }
    }
    
    return res
    
};

透過先累計目前對應的數字後, 再比較是否大於前一位數字, 
如果是就代表是羅馬數字的 9 系列, 只要把前一位多加與這次要減掉的數字與結果相減後, 
就可以得到答案

 

2022年1月19日 星期三

Leetcode - Medium - 12. Integer to Roman - Javascript


Medium

Roman numerals are represented by seven different symbols: IVXLCD and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, 2 is written as II in Roman numeral, just two one's added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given an integer, convert it to a roman numeral.

 

Example 1:

Input: num = 3
Output: "III"
Explanation: 3 is represented as 3 ones.

Example 2:

Input: num = 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.

Example 3:

Input: num = 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

Constraints:

  • 1 <= num <= 3999

 


解題方向:
1. 這邊主要是要搞懂 Roman 規則, 再擬定羅馬與數字對照表
    a. 1 ~ 3 是用 I 表示
    b. 4 ~ 8 是與 V 相關
    c. 9 ~ 10 是和 ‘X’ 相關


程式碼 :
/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
    if (num < 1 || num > 3999) { return ''; }
    
    const romanList = {
        1000: "M", 
        900: "CM", 
        500: "D", 
        400: "CD", 
        100: "C", 
        90: "XC", 
        50: "L", 
        40: "XL", 
        10: "X", 
        9: "IX", 
        5: "V", 
        4: "IV", 
        1: "I"
    }
    
    const numList = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
    let index = 0;
    let result = '';
    let leastNum = num;
    
    while(index < numList.length) {
        const numMod = numList[index];
        index++;
        
        const repeatNum = parseInt(leastNum / numMod);
        
        if (repeatNum === 0) { continue;}
        
        leastNum = leastNum - (repeatNum * numMod);
        result += romanList[numMod].repeat(repeatNum);
        
    }
    
    return result;
};



執行成果:


2022年1月18日 星期二

Leetcode - Medium - 11. Container With Most Water - Javascript


11. Container With Most Water

Medium

You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]).

Find two lines that together with the x-axis form a container, such that the container contains the most water.

Return the maximum amount of water a container can store.

Notice that you may not slant the container.

 

Example 1:

Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

Example 2:

Input: height = [1,1]
Output: 1

 

Constraints:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104





解題方向:


程式碼 :
/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
  const heightLen = height.length;
  let leftIndex = 0;
  let rightIndex = heightLen - 1;

  let maxCount = 0;

  while (leftIndex !== rightIndex) {
    const dist = rightIndex - leftIndex;
    let leftLine = height[leftIndex];
    let rightLine = height[rightIndex];
    
    let minHeight;
    if (leftLine < rightLine) {
        minHeight = leftLine;
        leftIndex++;
    } else {
        minHeight = rightLine;
        rightIndex--
    }
      
    const _curentNum  = minHeight * dist;

    if (maxCount < _curentNum) {
      maxCount = _curentNum;
    }
  }

  return maxCount;
};



執行成果: