代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方

3 阅读2分钟

704 二分查找

相关链接:题目链接 文章讲解 视频讲解

解题思路

重点:定好区间

开闭:包含这个元素

左闭右闭:[left, right]

  • left:0 左侧初始下标
  • right:nums.length - 1 右侧初始下标
  • middle

判断条件:确保 left <= right

  • left + ((right - left) >> 1):计算 middle
  • nums[middle] < target]:中间值小于目标值,目标值在右侧,更新 left 为middle + 1
  • nums[middle] > target]: 中间值大于目标值,目标值在左侧,更新 right 为middle - 1
  • nums[middle] === target:等于目标值,返回 middle

代码 Time complexity: O(logn) Space complexity: O(1)

var search = function(nums, target) {
    var left = 0, right = nums.length-1, middle;
    while(left<=right){
        middle = left + ((right - left) >> 1);
        if(nums[middle] > target){
            right = middle -1;
        }else if(nums[middle] < target){
            left = middle + 1;
        }else{
            return middle;
        }
    }
    return -1;
};

左闭右开:[left, right)

  • left:0 左侧初始下标
  • right:nums.length 右侧初始下标
  • middle

判断条件:确保 left < right

  • left + ((right - left) >> 1):计算 middle
  • nums[middle] < target]:中间值小于目标值,目标值在右侧,更新 left 为middle + 1
  • nums[middle] > target]: 中间值大于目标值,目标值在左侧,更新 right 为middle
  • nums[middle] === target:等于目标值,返回 middle

代码 Time complexity: O(logn) Space complexity: O(1)

var search = function(nums, target) {
    var left = 0, right = nums.length, middle;
    while(left<right){
        middle = left + ((right - left) >> 1);
        if(nums[middle] > target){
            right = middle;
        }else if(nums[middle] < target){
            left = middle + 1;
        }else{
            return middle;
        }
    }
    return -1;
};

27.移除元素

相关链接:题目链接 文章讲解 视频讲解

解题思路

重点:双指针

  • fast:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • slow:指向更新 新数组下标的位置

代码

Time complexity: O(n) Space complexity: O(1)

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

977.有序数组的平方

相关链接:题目链接 文章讲解 视频讲解

解题思路

数组有序,但负数平方之后可能成为最大数。那么数组平方的最大值就在数组的两端,不是最左就是最右,不可能是中间。 双指针法

  • 左指针 left: 指向数组起始(最小负数)。
  • 右指针 right:指向数组结尾(最大正数)。

注意:从后往前填充新数组:取 abs(nums[left]) 和 abs(nums[right]) 较大的数平方,填入结果数组的最后位置。 移动指针(较大平方数对应的指针向内移动)

代码

var sortedSquares = function(nums) {
    var res=[],idx=nums.length-1;
    for(var right = nums.length-1,left = 0;left<=right;){
        if(nums[left] * nums[left] < nums[right] * nums[right]){
            res[idx--] = (nums[right]*nums[right]);
            right--;
        }else{
             res[idx--] = (nums[left] * nums[left]);
            left++;
        }
    }
    return res;
};