代码随想录day01 | 704. 二分查找,27. 移除元素

文章介绍了二分查找算法的两种边界情况,强调了区间处理的重要性,并提供了两种不同版本的代码实现。同时,文章讨论了移除元素的问题,对比了使用快慢指针的双指针方法和直接修改数组的方法,指出双指针法在数组操作中的优势。
摘要由CSDN通过智能技术生成

代码随想录day01 | 704. 二分查找,27. 移除元素

704. 二分查找

题目连接:

704二分查找【简单】

解题思路:

1.二分法的基本思想,确定数组的边界是左闭右闭即[left, right],或者左闭右开即[left, right)。必须要坚持区间的开闭原则!!!!
2.进行循环,确定循环停止的条件
3.取中间值的下标方法是 let mid = ~~(left+(right - left)/2),再判断中间值和目标值的大小,进行赋值操作。如果等于目标值,直接返回下标

两种版本的代码:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
  let length = nums.length
  let left = 0
  let right = length-1
  // 定义target在左闭右闭的区间里,[left, right]
  
  while(left <= right) {// 当left==right,区间[left, right]依然有效,所以用 <=
    let mid = ~~((left + right)/2)
    if(target < nums[mid]) {
      right = mid-1// target 在左区间,所以[left, mid- 1]
    } else if(target > nums[mid]) {
      left = mid+1// target 在右区间,所以[mid+ 1, right]
    } else { // nums[mid] == target
      return mid// 数组中找到目标值,直接返回下标
    }
  }
// 未找到目标值
  return -1
}
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
  let length = nums.length
  let left = 0
  let right = length-1
  // 定义target在左闭右开的区间里,即:[left, right)
  
  while(left < right) {// 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
    let mid = ~~((left + right)/2)
    if(target < nums[mid]) {
      right = mid// target 在左区间,在[left, mid)中
    } else if(target > nums[mid]) {
      left = mid+1// arget 在右区间,在[mid+ 1, right)中
    } else { // nums[mid] == target
      return mid// 数组中找到目标值,直接返回下标
    }
  }
// 未找到目标值
  return -1
}

重点

确定了一个区间的形式,一定要严格遵守区间来进行边界的处理!!

收获

掌握了二分查找两种边界状态的实现代码

27. 移除元素

题目连接:

27. 移除元素【简单】

解题思路:

1.移动数组:使用快慢指针的方法解题

代码

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
//自己写的不用双指针的方法
var removeElement = function(nums, val) {
  for(let i=0; i<nums.length; i++) {
    if(nums[i] === val) {
      nums.splice(i,1)
      i--
      continue;
    }
  }
  return nums.length
};
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
//时间复杂度:O(n)
//空间复杂度:O(1)
//使用双指针(快慢指针)的方法
var removeElement = (nums, val) => {
    let k = 0;
    for(let i = 0;i < nums.length;i++){
        if(nums[i] != val){
            nums[k++] = nums[i]
        }
    }
    return k;
};

重点

1.数组按照下标的位置进行裁剪的方法是array.splice(start[, deleteCount[, item1[, item2[, …]]]])
2.使用双指针的方法,可以在原数组上修改

收获

很多考察数组、链表、字符串等操作的面试题,都使用双指针法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值