leetcode 二分法查找和移除元素

二分法

先把正确答案放出来(取前不取后)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int middle, head, end;
        head = 0;
        end = nums.size();
        while (head < end) {
            middle = head + (end - head) / 2;
            if (nums[middle] == target)  
            return middle;          
            if (nums[middle] > target)
                end = middle;
            if (nums[middle] < target)
                head = middle + 1;
        }
        return -1;
    }
};
                return middle;

使用数组的时候要很注意是否超出数组的长度限制:

例如while循环这一句我有一种错误写法和两种正确写法

while (head <= end)
for (int i = 0; i <= nums.size()/2; i++)
//以上两个是对的
for (int i = 0; i < (nums.size()+1)/2; i++)
//数组元素个数是二的时候会出问题
for (int i = 0; i < nums.size()/2; i++)
//问题同上

接下来是取后不取前

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int middle, head, end;
        head = 0;
        end = nums.size() - 1;
        while(head <= end) {
            middle = head + (end - head) / 2;
            if (nums[middle] == target)
                return middle;
            if (nums[middle] > target)
                end = middle - 1;
            if (nums[middle] < target)
                head = middle + 1;
        }
        return -1;
    }
};

两种方法的主要区别是while判定的时候的相等和middle在不取后的时候就可以直接middle = head。

移除元素

移除元素尝试过暴力求解但是时间一直过长,这里放一下代码,主要说说快慢指针;

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
      int size = nums.size();
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) { 
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--; 
                size--; 
            }
        }
        return size;
    }
};

其核心思想就是让后一位元素“代替”前一位元素;但是要记住因为后一位元素前移一定要i--这样才能保证连续的val被识别到

快慢指针主要核心就是两个指针错位指到数组元素;即是两辆车,快指针永远正常行驶,在没遇到“val”就会拉一下后面的慢指针并且传值,如果遇到了,就抛下慢指针,并且不传值,这样代码避免的两个for语句,运行速度了不少。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值