第一章 数组part01 Day01

80 阅读3分钟

第一章 数组part01

今日任务

数组理论基础,704. 二分查找,27. 移除元素

  • 详细布置
  • 数组理论基础
  • 文章链接 programmercarl.com/%E6%95%B0%E…
  • 题目建议: 了解一下数组基础,以及数组的内存空间地址,数组也没那么简单。

题目

704. 二分查找

题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。 先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function (nums, target) {
  let left = 0,
    right = nums.length - 1;

  while (left <= right) {
    let mid = left + ((right - left) >> 1);
    if (nums[mid] === target) {
      return mid;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  return -1;
};

35.搜索插入位置

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

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
  let left = -1;
  let right = nums.length;

  while (left + 1 < right) {
    let mid = left + ((right - left) >> 1);
    let number = nums[mid];

    if (number === target) {
      return mid;
    } else if (target > number) {
      left = mid;
    } else {
      right = mid;
    }
  }
  return left + 1;
};

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

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

27. 移除元素

题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。

题目链接:leetcode.cn/problems/re… 文章讲解:programmercarl.com/0027.%E7%A7… 视频讲解:www.bilibili.com/video/BV12A…

/*
示例 2:

输入:
nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,3,0,4]
解释: 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。


注意解释:注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。


双指针的思路是:
slow慢指针:指向符合不等于val值的元素移动到新元素的索引位置
fast快指正:用来获取新数组中的元素

简单思路:
已示例2来说:
    slow负责符合条件的元素的插入索引、fast负责寻找新的符合条件的元素
*/

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function (nums, val) {
    let slow = 0;

    for (let fast = 0; fast < nums.length; fast++) {
        // 快指针遍历寻找符合条件(不等于val)的数组中的值,找到则把该值放到慢指针对应的新的索引位
        // 而等于val的不需要管由后面的值覆盖掉,即使覆盖不掉,后面的等于val也会超出‘新数组的长度’被机制自动截断
        if (nums[fast] !== val) {
            nums[slow] = nums[fast];
            slow++;
        }
    }

    return slow;
};