leetcode Day36 剑指专项 5-10

88 阅读1分钟

965. 单值二叉树

var isUnivalTree = function(root) {
    if(!root)return true
    if(root.left){
        if(root.left.val!==root.val || !isUnivalTree(root.left)){
            return false
        }
    }
    if(root.right){
        if(root.right.val!==root.val || !isUnivalTree(root.right)){
            return false
        }
    }
    return true
};

剑指 Offer II 005. 单词长度的最大乘积

var maxProduct = function(words) {
    let res=0
    for(let i=0;i<words.length;i++){
        for(let j=i+1;j<words.length;j++){
            if(!hasSameLetter(words[i],words[j])){
                res=Math.max(res,words[i].length*words[j].length)
            }
        }
    }
    return res
};
const hasSameLetter=(w1,w2)=>{
    for(let i of w1){
        if(w2.indexOf(i)!==-1){
            return true
        }
    }
    return false
}

剑指 Offer II 006. 排序数组中两个数字之和

var twoSum = function(numbers, target) {
    //双指针 时间O(n) 空间O(1)
    let i=0,j=numbers.length-1
    let res=[]
    while(i!==j){
        if(numbers[i]+numbers[j]>target){
            j--
        }
        else if(numbers[i]+numbers[j]<target){
            i++
        }
        else{
            res.push(i)
            res.push(j)
            break
        }
    }
    return res
};

剑指 Offer II 007. 数组中和为 0 的三个数

var threeSum = function(nums) {
    let res=[]
    nums.sort((a,b)=>a-b)
    if(nums.length<3)return []
    for(let i=0;i<nums.length-2;i++){
        if(i>0 && nums[i]===nums[i-1])continue
        let target=-nums[i]
        let l=i+1,r=nums.length-1
        while(l<r){
            if(nums[l]+nums[r]===target){
                res.push([-target,nums[l],nums[r]])
                //去重,如果l或r没有变化,没必要算他们的和
                while(l<r){
                    l++
                    if(nums[l]!==nums[l-1])break
                }
                while(l<r){
                    r--
                    if(nums[r]!==nums[r+1])break
                }
            }else if(nums[l]+nums[r]<target){
                l++
            }else{
                r--
            }
        }
    }
    return res
};

剑指 Offer II 008. 和大于等于 target 的最短子数组

var minSubArrayLen = function(target, nums) {
    let l=0
    let sum=0
    let res=1000000
    //滑动窗口,在可行解里找最优解
    for(let r=0;r<nums.length;r++){
        sum+=nums[r]
        while(l<=r && sum>=target){
            res=Math.min(res,r-l+1)
            sum-=nums[l]
            l++
        }
    }
    return res===1000000?0:res
};

剑指 Offer II 009. 乘积小于 K 的子数组

var numSubarrayProductLessThanK = function(nums, k) {
    let res=0,l=0,r=0,ans=1
    while(r<nums.length){
        ans*=nums[r]
        while(ans>=k && l<=r){
            ans/=nums[l]
            l++
        }
        res+=r-l+1
        r++
    }
    return res
};

剑指 Offer II 010. 和为 k 的子数组

var subarraySum = function(nums, k) {
    const mp = new Map();
    mp.set(0, 1);
    let count = 0, pre = 0;
    for (const x of nums) {
        pre += x;
        if (mp.has(pre - k)) {
            count += mp.get(pre - k);
        }
        if (mp.has(pre)) {
            mp.set(pre, mp.get(pre) + 1);
        } else {
            mp.set(pre, 1);
        }
    }
    return count;
};