这些力扣题目来源:AI推荐+karshey博主

目录

704. 二分查找(通过)

27.移除元素(通过)

977.有序数组的平方(通过)

209. 长度最小的子数组(前缀和+滑动指针)(通过)

303.区域和检索-数组不可变(前缀和)(通过)

59.螺旋矩阵II(通过)


704. 二分查找(通过)

704二分查找

1. 每一次查找都需要利用中间坐标 mid =Math.floor((start+end)/2)

2. 如果中间坐标的值大于查找目标,说明查找目标在左半部分:end=mid-1

3. 如果中间目标的值小于查找目标,说明查找目标在右半部分:start=mid+1

4. 找不到的话,返回-1

nums = [-1,0,3,5,9,12], target = 9


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

console.log(search(nums,target));

27.移除元素(通过)

27.移除元素

splice方法会改变数组本身:此方法可以删除或者加入新的元素

nums = [0,1,2,2,3,0,4,2], val = 2

var removeElement = function(nums, val) {
    let k=0;
    let pointer = 0;
    while(pointer<=nums.length-1){
        if(nums[pointer]==val) {
            nums.splice(pointer,1)
        } else{
            k++;
            pointer++;
        }
    }
    // console.log(nums);
    return k;
};

console.log(removeElement(nums,val));

977.有序数组的平方(通过)

977.有序数组的平方

1. sort()分类方法 需要规定顺序,否则会按照字符串顺序返回

nums = [-4,-1,0,3,10]

var sortedSquares = function(nums) {
    let ans=[];
    for(let i=0;i<nums.length;i++){
        ans.push(nums[i]**2)
    }
    ans.sort((a,b)=>a-b)
    return ans;
};

console.log(sortedSquares(nums));

209. 长度最小的子数组(前缀和+滑动指针)(通过)

209. 长度最小的子数组

1. 使用前缀和可以快速求某一段数组的和 sum(n,m)=sum(0,m)-sum(0,n) +nums[n]

2. 因为全是正数:所以向右滑总和一定增加,向左滑总和一定减小

3. 滑动结束的条件:无法再向右滑增大:(start<nums.length&&end<nums.length)

4. 最后可以使用三元运算符判断 min==Infinity?0:min;

target = 7, nums = [2,3,1,2,4,3]

var minSubArrayLen = function(target, nums) {
    let min=Infinity;
    let start=0;
    let end=0;

    let sum_arr=[];
    let sum=0
    for(let i=0;i<nums.length;i++){
        sum+=nums[i];
        sum_arr.push(sum);
    }

    while(start<nums.length&&end<nums.length){
        if(sum_arr[end]-sum_arr[start]+nums[start]>=target){
            min=min<end-start+1?min:end-start+1;
            start++;
        } else {
            end++;
        }  
    }
    return min==Infinity?0:min;
};

console.log(minSubArrayLen(target,nums));

303.区域和检索-数组不可变(前缀和)(通过)

303.区域和检索-数组不可变

/**
 * @param {number[]} nums
 */
var NumArray = function(nums) {
    this.nums=nums;
    this.sum=[]
    this.temp=0
    for(let i=0;i<(this.nums).length;i++){
        this.temp+=this.nums[i];
        this.sum.push(this.temp);
    }
};

/** 
 * @param {number} left 
 * @param {number} right
 * @return {number}
 */
NumArray.prototype.sumRange = function(left, right) {
    return this.sum[right]-this.sum[left]+this.nums[left];
};

/** 
 * Your NumArray object will be instantiated and called as such:
 * var obj = new NumArray(nums)
 * var param_1 = obj.sumRange(left,right)
 */

59.螺旋矩阵II(通过)

59.螺旋矩阵II

1. 创建二维数组,第一次需要fill(0)。否则后面的数组会被赋予相同的地址,一起改变值

2. 大循环结束的条件是数数小于平方

3. 数组的每个元素初始化都是0,代表这个位置还没有被走过。如果被走过或者越界,则结束小循环

4. 按照右,下,左,上的顺序依次走

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let count=1;

    let matrix = Array(n).fill(0).map(()=>Array(n).fill(0))
    let i=0;
    let j=-1;
    while(count<=n*n){
        while(j<n-1 && matrix[i][j+1]==0){
            j++;
            matrix[i][j]=count++;
        }

        while(i<n-1 && matrix[i+1][j]==0){
            i++;
            matrix[i][j]=count++;
        }

        while(j>0 && matrix[i][j-1]==0){
            j--;
            matrix[i][j]=count++;
        }

        while(i>0 && matrix[i-1][j]==0){
            i--;
            matrix[i][j]=count++;
        }
    }
    return matrix;
};

console.log(generateMatrix(3));

更多推荐