leetcode Day5 数组

50 阅读1分钟

704. 二分查找

var search = function(nums, target) {
    let l=0,r=nums.length-1
    let mid=Math.floor((l+r)/2)
    while(l<=r){
        if(nums[mid]===target){
            return mid
        }
        else if(nums[mid]>target){
            r=mid-1
            mid=Math.floor((l+r)/2)
        }
        else{
            l=mid+1
            mid=Math.floor((l+r)/2)
        }
    }
    return -1
};

35. 搜索插入位置

var searchInsert = function(nums, target) {
    let l=0,r=nums.length-1
    while(l<=r){
        let mid=Math.floor((l+r)/2)
        if(nums[mid]===target){
            return mid
        }
        else if(nums[mid]>target){
            r=mid-1
        }
        else{
            l=mid+1
        }
    }
    return r+1
};

在排序数组中查找元素的第一个和最后一个位置

var searchRange = function(nums, target) {
    const getLeftIdx=(nums,target)=>{
        let l=0,r=nums.length-1
        let leftIdx=-2
        while(l<=r){
            let mid=Math.floor((l+r)/2)
            if(nums[mid]>=target){
                r=mid-1
                leftIdx=r
            }
            else{
                l=mid+1
            }
        }
        return leftIdx
    }
    const getRightIdx=(nums,target)=>{
        let l=0,r=nums.length-1
        let rightIdx=-2
        while(l<=r){
            let mid=Math.floor((l+r)/2)
            if(nums[mid]>target){
                r=mid-1
            }
            else{
                l=mid+1
                rightIdx=l
            }
        }
        return rightIdx
    }
    let left=getLeftIdx(nums,target)
    let right=getRightIdx(nums,target)
    if(left===-2 || right===-2){
        return [-1,-1]
    }
    if (right - left > 1) return [left + 1, right - 1];
    return [-1,-1]
};

27. 移除元素

var removeElement = function(nums, val) {
    let k=0
    for(let i=0;i<nums.length;i++){
        if(nums[i]!==val){
            nums[k]=nums[i]
            k++
        }
    }
    return k
};

977. 有序数组的平方

var sortedSquares = function(nums) {
    let res=new Array(nums.length).fill(0)
    let k=nums.length-1
    let l=0,r=nums.length-1
    while(l<=r){
        if(nums[l]**2>nums[r]**2){
            res[k]=nums[l]**2
            l++
            k--
        }
        else if(nums[l]**2<=nums[r]**2){
            res[k]=nums[r]**2
            r--
            k--
        }
    }
    return res
};

209. 长度最小的子数组

var minSubArrayLen = function(target, nums) {
    let l=0,r=0,res=0
    let ans=nums.length+1
    while(r<nums.length){
        res=res+nums[r]
        r++
        while(res>=target){
            ans=ans>r-l?r-l:ans
            res=res-nums[l]
            l++
        }
    }
    return ans>nums.length?0:ans
};