假期leetcode刷题计划day1

leetcode-704 二分查找

        具体思路:二分查找用于在有序数组中查找信息,分别取数组的最左端和最右端为 left = 0 right = nums.size() - 1,在用另一个变量 mid 记录中间位置的值,即 mid = (left + right)/ 2,也可以用 mid = (right - left)/ 2 + left 来计算中间位置的下标。通过将中间位置的值同要查找的数值(target)比较,选择让搜索区间是左侧向中间缩还是右侧向中间缩。因为在有序数组中要么从大到小;要么从小到大排列,(以升序为例)当中间值比查找的值小是,那么左侧的值均比要查找的值要小,所以要将左侧向中间缩,即 left = mid + 1;若中间值比要查找到的值大,那么就让 right = mid -1

        二分查找实际就是通过不停地让中间位置的值去比较判断我要查找的数值应该存在于哪个区间,进而不断的将区间缩小。

        对于查找值的判断只有3种情况:

  •         nums[mid] == target;
  •         nums[mid] < target;
  •         nums[mid] > target;

        (以升序为例)等于  则直接返回 mid,

        小于  则另 left = mid + 1,

        大于  则另 right = mid - 1。

#include <iostream>
#include <vector>
using namespace std;

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

leetcode-27移除元素

思路:双指针法,遍历数组将非val元素依次放入数组中,并记录长度。

right遍历整个数组,left记录新数组的长度,当 nums[right] = val 时跳过(因为不管是不是最终的结果都会被覆盖),当 nums[right] != val 时将此时的值把 left 所指的值覆盖。(原本想的是交换,最后看了题解才发现可以直接覆盖)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {  //双指针法
        int n = nums.size();
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }
};

(菜鸡勿喷)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值