LeetCode第一天|704.二分查找 27.移除元素

704.二分查找

题目链接: https://leetcode.cn/problems/binary-search/

关键词:有序、整型数组

解法一:二分查找

注意:自己预设的区间是左闭右闭区间还是左闭右开

int search(int* nums, int numsSize, int target){
    int left = 0, right = numsSize-1;  //0~numsSize-1即默认了左闭右闭区间
    while(left <= right){  //左闭右闭区间,要小于等于,因为left与right相等时也在判断范围内
        int mid = left + (right - left) /2;  //防止int溢出
        if(target == nums[mid]){
            return mid;
        }else if(target < nums[mid]){
            right = mid - 1;
        }else{
            left = mid + 1;
        }
    }
    return -1;
}

心得:判断是否大于等于还是仅大于、是否要加1或减1等此类情况,就是看该数是否在你的判断区间内,如此题:while(left <= right) 要加上等于号,因为是左闭右闭区间,在left = right时,如[1,1]区间, 1是在你的判断区间内的,故需要等于号

解法二:暴力法

一个for循环即可

class Solution {
public:
    int search(vector<int>& nums, int target) {
        for(int i = 0; i < nums.size(); i++){	//注意c++中vector容量大小的写法
            if(nums[i] == target){
                return i;
            }
        }
    return -1;
    }
};

27.移除元素

题目链接: https://leetcode.cn/problems/remove-element/
关键词:数组

解法一:双指针法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0, length = nums.size();     
        for(int fast = 0; fast < nums.size(); fast++){  //快指针遍历数组
            if(nums[fast] != val){     //碰到非目标元素才会把该元素保留
                nums[slow] = nums[fast];
                slow++;    //慢指针更新非目标元素的下标,为目标元素时(即执行else时)slow相当于保持在目标元素的下标,方便fast找到非目标元素时进行目标元素的移除
            }else{  //数组减小的时机就是nums[fast] = val
                length--;
            }
        }
    return length;
    }
};

解法二:暴力法

两个for即可,第一个for遍历完整个数组,第二个for移动元素

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int length = nums.size();
        for(int i = 0; i < length; i++){
            if(nums[i] == val){
                for(int j = i + 1; j < length; j++){    //若为最后一个元素则不会执行for,因为j<length(最后一个元素和前面的元素操作不同,最后一个元素直接length--)
                    nums[j - 1] = nums[j];
                }
                length--;
                i--;    //被移除元素的位置被新元素代替,故i--再判断一次这个位置
            }
        }
    return length;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值