哈希
兩數之和
暴力解法
/*** @param {number[]} nums* @param {number} target* @return {number[]}*/
var twoSum = function(nums, target) {for(let i =0;i<nums.length;i++){let x1 = nums[i]for(let j = 0 ; j<nums.length;j++){if(i!=j){let x2 = nums[j]if(x1+x2==target){return [i,j]}}}}
};
Map法
var twoSum = function(nums, target) {const map = new Map()for(let i=0;i<nums.length;i++){let key = target-nums[i]if(map.has(key)){return [map.get(key),i]}else{map.set(nums[i],i)} }return []
};
字母異味詞分組
/*** @param {string[]} strs* @return {string[][]}*/
var groupAnagrams = function(strs) {let map = new Map(); for (let i = 0; i < strs.length; i++) { let word = strs[i]; // 使用數組的 sort 方法對字符串的字符進行排序,并將排序后的字符數組重新連接成字符串 let sorted_word = word.split('').sort().join(''); if (map.has(sorted_word)) { map.get(sorted_word).push(word); } else { map.set(sorted_word, [word]); } } // 將Map中的值(數組)轉換為數組返回 return [...map.values()];
};
最長連續序列
var longestConsecutive = function(nums) {if (nums.length === 0) return 0; let set = new Set(nums); let maxSize = 0; for (let num of set) { // 跳過非連續序列的起始數字(即那些前面有數字的數字) if (!set.has(num - 1)) { let currentNum = num; let currentLength = 1; // 遍歷連續序列 while (set.has(currentNum + 1)) { currentNum++; currentLength++; } // 更新最大長度 maxSize = Math.max(maxSize, currentLength); } } return maxSize;
};
雙指針
移動零
解法1
先遍歷數組,計算非零元素的數量。然后,在第二次遍歷中,只將非零元素復制回數組的前部,并跳過0。
function moveZeroes(nums) { let count = 0; for (let num of nums) { if (num !== 0) { count++; } } let writeIndex = 0; for (let num of nums) { if (num !== 0) { nums[writeIndex++] = num; } } // 填充剩余的0for (let i = writeIndex; i < nums.length; i++) { nums[i] = 0; } return nums
}
解法2
- 初始化兩個指針,
slow
?和?fast
,都指向數組的第一個元素。 - 遍歷數組(
fast
?從頭到尾),對于每個?nums[fast]
:- 如果?
nums[fast]
?不為 0,則交換?nums[slow]
?和?nums[fast]
,并將?slow
?向后移動一位(slow++
)。 - 如果?
nums[fast]
?為 0,則只移動?fast
?指針。
- 如果?
- 遍歷結束后,所有非零元素都已經被移動到了數組的前面,而后面的元素則自動成為了 0
var moveZeroes = function(nums) {let slow=0let fast = 0for(fast;fast<nums.length;fast++){if(nums[fast]!=0){let swap = nums[slow]nums[slow] = nums[fast]nums[fast] = swapslow++}}return nums
};
盛最多水的容器
- 初始化左指針?
left
?為 0,右指針?right
?為?height.length - 1
。 - 進入循環,當?
left < right
?時執行以下步驟:- 計算當前容器的面積?
area = Math.min(height[left], height[right]) * (right - left)
。 - 更新最大面積?
maxArea
(如果?area
?大于?maxArea
)。 - 如果?
height[left] < height[right]
,則?left++
(移動左指針),否則?right--
(移動右指針)。
- 計算當前容器的面積?
- 退出循環后,
maxArea
?就是所求的最大面積。
var maxArea = function(height) {let left = 0let right = height.length-1let max = 0while(left<right){let h1 = height[left]let h2 = height[right]let area = Math.min(h1, h2) * (right - left)max = Math.max(max, area); if (h1 > h2) { right--; } else { left++; } }return max
};