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

Leetcode 704 二分查找

题目链接:

704. 二分查找 - 力扣(LeetCode)

思路:

二分查找这道题目本人已经刷第二遍了,今天再看到这道题目的时候还能记住解题思路:首先是区间的定义作为不变量,在二分查找的整个过程中必须保持 区间的定义 不变!区间的定义有两种:左闭右闭 和 左闭右开。其次是循环的条件:因为我选择的是左闭右闭区间,因此,循环的条件中可以取“=”号,其原因是为了保持区间定义的不变量。最后是区间的更新:原则就是 已经查找过的元素值不要重复进行查找比较。

本人题解:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        //如果用的是左闭右闭区间的话,需要减去1,因为下标从0开始
        while (left <= right) {
            int mid = (left + right)/2;
            if (target > nums[mid]) {
                left = mid + 1;
                continue;
            }
            else if (target < nums[mid]) {
                right = mid - 1;
                continue;
            }
            else {
                return mid;
            }
        }
        return -1;
    }
};

时间复杂度: O(logn)

Leetcode 27 移除元素

题目链接:

27. 移除元素 - 力扣(LeetCode)

思路:

这道题我也能勉强记住思路自己刷。看到题目就想到了用快慢双指针法,需要注意的细节如下:快指针用于筛选符合新的数组的元素,而慢指针用于保存新的数组的元素;慢指针的大小其实就是新的数组的大小。

本人题解:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //这道题目是采用的典型的快慢双指针法
        //一般快指针用于搜索符合新集合的元素,并用慢指针进行存储
        int slow = 0;
        int fast = 0;
        int n = nums.size();
        for (; fast < n; fast++) {
            if (nums[fast] == val) continue;
            nums[slow] = nums[fast];
            //将快指针搜索到的符合新集合要求的值赋给慢指针进行保存
            slow++;
        }
        return slow;//slow的值其实就是新的数组的长度
    }
};

时间复杂度:O(n) 

今日用时 

自己凭印象刷题花费:20分钟

刷题后再看一遍代码随想录花费:30分钟 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值