力扣hot100哈希

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;
    
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值