算法打卡day01 | 704.二分查找 | 27.移除元素JavaScript

170 阅读2分钟

数组理论基础

JS的数组每个槽位可以存放不同数据类型的数据,并且也是动态大小,这与C、Java不同。

  • 创建数组
    let arr = new Array();使用Array构造函数;
    let arr = new Array(20);可指定长度;
    let arr = Array('a','b');也可省略new操作符;
    let arr = [];使用数组字面量创建,创建时不使用Array构造函数。
  • 不改变原数组的方法
    concat join slice filter reduce find findIndex
  • 改变原数组的方法
    pop push shift unshift sort reverse splice

二分查找

LeetCode 704.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

  • 思路:有序数组就要想到二分查找,否则就是遍历一个一个寻找了。
  • 注意点:注意leftright组成区间的边界值处理。
    • [left, right]情况下,leftright相等是有意义的,所以while循环时是left<=right,然后查找失败时也是mid±1,因为之前的mid已经包含过边界值了,所以下一轮的边界也要排除原来取过的left或者right
    • (left,right] [left, right)这种情况,left===right时是没意义的,所以while的条件是left<right,并且查找失败后,新边界的取值也是不能与上一轮的值有重合,根据前面的区间,可以为:left = mid;right = mid - 1;left = mid + 1;right = mid;
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    while(left <= right){
        let mid = left + Math.floor((right - left) / 2);
        if(nums[mid] === target){
            return mid;
        }else if(nums[mid] > target){
            right = mid - 1;
        }else{
            left = mid + 1;
        }
    }
    return -1;
};

双指针、快慢指针

LeetCode 27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

  • 思路:暴力法,直接用后面元素覆盖前面的元素,两层for循环,时间复杂度O(N*N);
  • 改进方法:根据代码随想录的法二,快慢指针,使用双指针法,可以使时间复杂度降为O(N)。
  • 注意点:注意fast指针是遍历数组寻找不等于val的元素,slow指针是指向更新数组下标的位置。
/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    let slow = 0;
    for(let fast = 0; fast < nums.length; fast ++){
        if(nums[fast] !== val){
            nums[slow] = nums[fast];
            slow += 1;
        }
    }
    return slow;
};

快慢指针可能比较难理解,但是可以跟着题解走一遍流程,观察每次fast和slow的数据变化,还是能理解一些的,下次写也能直接自己写出来。

碎碎念:万事开头难,算法打卡day01其实应该是12.8(昨天),但是昨天狂补两个实验报告+沟通毕设问题,只把力扣过了一遍,博客还是留了一半今天才写完。

Anyway,二分查找和移除元素这两题,其实一周前有整理一遍,但是写的时候还是要抠细节,属于是那种可以闭着眼睛写,但是还得睁眼改细节改bug的题目🤦‍😀。

每次写打卡博的时候,争取把涉及到的数据结构也提一下~