leetcode Day2

103 阅读1分钟

954. 二倍数对数组

每日一题,开始的思路是遍历每一个数,如果这个数的两倍和这个数的1/2都不在数组中,则返回false,否则true,但未考虑如[1,2,4,4,8,16]这种情况,于是需要用map存储每个元素的个数

var canReorderDoubled = function(arr) {
    arr.sort((a,b)=>a-b)
    let keyNums=new Map()
    for(let i=0;i<arr.length;i++){
        keyNums.set(arr[i],keyNums.get(arr[i])?keyNums.get(arr[i])+1:1)
    }
    for(let i=0;i<arr.length;i++){
        if(keyNums.has(arr[i]) && keyNums.has(arr[i]*2)){
            if(keyNums.get(arr[i])>0 && keyNums.get(arr[i]*2)>0){
                keyNums.set(arr[i],keyNums.get(arr[i])-1)
                keyNums.set(arr[i]*2,keyNums.get(arr[i]*2)-1)
            }
        }
    }
    //forEach()中的return只会结束此次循环,执行下一次循环,无效
    let res=true
    keyNums.forEach(value=>{
        if(value>0){
            res= false
        }
    })
    return res
};

剑指 Offer 03. 数组中重复的数字

排序后遍历

var findRepeatNumber = function(nums) {
    nums.sort((a,b)=>a-b)
    for(let i=0;i<nums.length-1;i++){
        if(nums[i]===nums[i+1]){
            return nums[i]
        }
    }
};

剑指 Offer 04. 二维数组中的查找

var findNumberIn2DArray = function(matrix, target) {
    if(!matrix.length) return false;
    //以左下角为原点建立坐标轴
    //current<target,右移
    //current>target,上移
    let x = matrix.length - 1, y = 0;
    while(x >= 0 && y < matrix[0].length){
        if(matrix[x][y] === target){
            return true;
        }else if(matrix[x][y] > target){
            x--;
        }else{
            y++;
        }
    }
    return false;
};