代码随想录算法训练营打卡第一天

本文介绍了如何解决LeetCode中的二分查找问题(704题),包括暴力解法和优化后的二分查找算法,以及移除元素(27题)的快慢指针解决方案。作者通过实践学习,反思了编程技巧和语言表达的提升空间。
摘要由CSDN通过智能技术生成

代码随想录打卡第一天|| leetcode704二分查找,27移除元素

二分查找.704

视频链接:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

一开始看到这道题目时是没有想法的,所以就用了暴力解法硬做。 执行时间26ms。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;
    }
};
代码随想录解法思路

从左闭右闭或者左闭右开的思路处理二分法,推出循环的条件更简洁,通过left<=right or left < right即可。也不需要对result进行多重判断,直接返回middle即可。具体思路就是直接用left和right去定义搜索空间,然后进入while循环找中值判断,基于左闭右闭或者左闭右开的原则进行left或者right的重新赋值。主要注意的有两点,一个是在while循环的时候要根据[]或者[)的原则判断left<=right或者left<right是否是合法区间。第二个点在与比完大小后,赋值给left或者right的时候是否包含middle,如果是[ ]就不需要包含,因为middle已经比较过了。如果是[ )就需要包含。

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

用二分查找写完后感觉还是有些似懂非懂,没有完全理解透,写代码过程也不顺畅,容易卡住,代码水平也还有所欠缺。

移除元素.27

视频链接:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

代码随想录解法思路

快慢双指针,两个指针从同一位置出发(数组头部)。检查快指针的值是否是需要删除的数值,如果不是:快指针指向的值赋值给慢指针,快指针++,慢指针++。如果是:快指针++。直到快指针到数组结尾。此时返回慢指针的值就是删除操作后的数组长度

定义一个快指针和慢指针,在if语句判断目标值是否等于数组中的某个元素,如果等于就把这个元素赋值给慢指针组成一个新数组,最后返回新数组的下标。执行时间3ms.

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for(int fast = 0;fast < nums.size();fast++){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow++;
            }

        }
        return slow;
    }
};

 移除元素这部分感觉就是较好理解,思路理清之后很快就做完。

今天应该是学了有个两三小时,因为之前没写过博客,也在现学现做。还有就是语法也不够好,所以让我觉得日后还是该多学学,现在就先当个卑微的小渣渣啦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值