1两数之和
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const idxNums = {}; // 用于存储数字和下标的对应关系,字典,数字:下标
for (let i = 0; i < nums.length; i ++) {
const curNum = nums[i];
const targetNum = target - curNum;
const targetNumIndex = idxNums[targetNum];
if (targetNumIndex !== undefined) {
return [targetNumIndex, i];
}
idxNums[curNum] = i;
}
};
49字母异位词分组
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
// 哈希数组,eat:eat ate tea这种数据结构,最后返回值
const map = new Map();
for (let str of strs) {
let array = Array.from(str); // 转化为数组
array.sort(); // 排序
let key = array.toString(); // 转化为字符串
let list = map.get(key) ? map.get(key) : new Array(); // 查找
list.push(str); // 根据键修改值
map.set(key, list); // 放入字典
}
return Array.from(map.values());
};
128最长连续序列
哈希解法
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
// 哈希数组
// 如果当前数字num-1不在哈希数组中,说明这个数字是序列的起点,那么不断向后扩展,直到num+1不在数组中
// 如果当前数字num-1在数组中,说明这个数字不是起点,跳过
const setNums = new Set(nums); //去重
let maxLen = 0;
for (let num of setNums) {
if (!setNums.has(num - 1)){ //num-1不在数组中,说明是起点
let curNum = num;
let curLen = 1;
while(setNums.has(curNum + 1)){
curNum ++;
curLen ++;
}
maxLen = Math.max(maxLen, curLen);
}
}
return maxLen;
};
排序解法
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
// 先排序,再更新
if (nums.length === 0) return 0;
nums.sort((a, b) => a - b); // 按数值而不是字典排序[1,2,100,200]而不是[1,100,2,200]
let ans = 1;
let tmp = 1;
for (let i = 1; i < nums.length; i ++) {
if (nums[i] === nums[i - 1] + 1) {
tmp ++;
}else if (nums[i] !== nums[i - 1]){
tmp = 1;
}
ans = Math.max(ans, tmp);
}
return ans;
};