代码随想录算法训练营47期day1|数组part01

73 阅读1分钟

Day01 数组part01

学习内容:

704 二分查找

题目链接:leetcode.cn/problems/bi…

文章讲解:programmercarl.com/0704.%E4%BA…

视频讲解:www.bilibili.com/video/BV1fA…

要学会左闭右闭,左闭右开,两种写法。

  • 习惯性写出的是左闭右闭的写法:
var search = function (nums, target) {
  let left = 0;
  let right = nums.length - 1;
  while (left <= right) {
    let mid = Math.floor((left + right) / 2);
    if (nums[mid] == target) return mid;
    else if (nums[mid] < target) {
      left = mid + 1;
    } else if (nums[mid] > target) {
      right = mid - 1;
    }
  }
  return -1;
};
  • 左闭右开

    let left = 0;
    let right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
    
    • 由于选定区间左闭右开,则left == right无意义,因此循环条件应为while(left<right)
    • 向左区间寻找时,该区间不再包含 nums[mid],因此可以直接写成right=mid,不用mid-1。

27 移除元素

  • 使用双指针。
  • 总体思路就是当快指针值==val时,慢指针原地等待,等到快指针值!=val时,用它覆盖慢指针,并向前移动慢指针。
  • 当快指针指到末尾时,慢指针以前的元素就是数组里全部值!=val的元素了,我们不在乎慢指针之后的值是什么。

977 有序数组的平方

学习感悟:

  • 数组其实是有序的, 只不过负数平方之后可能成为最大数了。
  • 那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
var sortedSquares = function (nums) {
  let left = 0,
    right = nums.length - 1;
  let res = Array.from({ length: nums.length });
  for (let i = res.length - 1; i >= 0; i--) {
    if (nums[left] * nums[left] >= nums[right] * nums[right]) {
      res[i] = nums[left] * nums[left];
      left++;
      console.log(res[i]);
    } else {
      res[i] = nums[right] * nums[right];
      right--;
      console.log(res[i]);
    }
  }
  return res;
};