代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

本文介绍了如何在有序数组中使用二分查找法寻找目标值,并提供了两种实现方式:左闭右闭和左闭右开。同时,讲解了如何使用快慢指针在数组中移除特定元素的技巧。
摘要由CSDN通过智能技术生成

704 二分查找

题目链接:
https://leetcode.cn/problems/binary-search/
文章讲解:
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:
https://www.bilibili.com/video/BV1fA4y1o715
注意:
1、如果是有序数组,且无重复元素,可以考虑使用二分查找,这是两个必要条件。
2、有两种方法,左闭右闭和左闭右开,区别主要是while的条件是left<right还是left<=right(看left=right时有没有意义)和right=mid还是mid-1(一开始定的区间,在每一次更改左右指针后依然是这个闭合状态,因此如果一开始是右开,则right=mid,因为比较的时候不会与nums[mid]比较,而不是mid-1
方法一:[left,right]

/**
 * @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 + ((right-left)>>1);
        if(nums[mid] < target){
            left = mid + 1;
        }else if(nums[mid] > target){
            right = mid-1;
        }else{
            return mid;
        }
    }
    return -1;

};

方法二:[left,right)

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

在这里插入图片描述

27 移除元素

题目链接:
https://leetcode.cn/problems/remove-element/
文章讲解:
https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:
https://www.bilibili.com/video/BV12A4y1Z7LP
注意:
使用快慢指针,注意理解快指针和慢指针的含义,其中快指针指的是应该存放在新数组里的元素,慢指针是指新数组的下标。

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    let slow = 0,fast;
    for(fast=0;fast<nums.length;fast++){
        if(nums[fast] !== val){
            nums[slow] = nums[fast];
            slow++;
        }
    }
    return slow;
};
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值