记录算法Day1

代码随想录算法训练营第一天|Leecode 704 二分查找,Leecode 37 移除元素

开始第一天的博客打卡之前,推荐用vscode刷Leecode题目,分类很全,而且看的也非常美观,[配置教程链接]【VSCode】 VSCode配置LeetCode插件_leetcode vscode自定义输入-CSDN博客

在这里插入图片描述

Leecode 704 二分查找

题目链接 704. 二分查找
视频链接 https://www.bilibili.com/video/BV1fA4y1o715
文章链接 https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html

思路

这道题目之前见过很多次,就是很经典的用二分查找来做,前提是这道题说明有数组有序(升序),并且元素不会重复。二分查找的步骤相对来说比较简单,定义一个区间,从这个区间的中点找起,如果数组对应中点下标的值小于目标值,则目标值肯定在中点目标值的右边,更新区间左端点,大于同理,等于就说明中点下标对应数组的值是目标值,返回中点下标即可。要注意区间的范围(左闭右闭,左闭右开)

代码

  • 左闭右闭


class Solution {

public:

    int search(vector<int>& nums, int target) {

        int left = 0;

        int right = nums.size()-1;

        int middle = 0;

        while(left<=right){

            middle = left+(right-left)/2;//有个细节,right+left可能会炸int,这种写法比较保险

            if(nums[middle]>target) right = middle-1;

            else if(nums[middle]<target) left = middle+1;

            else return middle;

        }

        return -1;

    }

};
  • 左闭右开


class Solution {

public:

    int search(vector<int>& nums, int target) {

        int left = 0;

        int right = nums.size();

        int middle = 0;

        while(left<right){

            middle = left+(right-left)/2;

            if(nums[middle]>target) right = middle;

            else if(nums[middle]<target) left = middle+1;

            else return middle;

        }

        return -1;

    }

};

本题收获:之前在做的时候一直没有考虑区间具体范围问题,一直在试,过了就万事大吉,看了卡哥的讲解之后,对两种写法有了更深刻的认识,左闭右闭,取中间值下表上一个或者下一个,依然是闭区间且所有值都能取到,左闭右开,初始化右端点要等于数组末端点加一,且开区间的右端点只需更新中间值下标即可(因为开区间取不到)

Leecode 37 移除元素

题目链接 37 移除元素
视频链接 https://www.bilibili.com/video/BV12A4y1Z7LP
文章链接 https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html

思路

这道题感觉思路比较明确,直接定义两个变量(看了卡哥的文章才知道这种解法其实试双指针),一个变量用于遍历整个数组,即快指针,一个变量用于从头更新数组中满足条件的值,即慢指针。

代码



class Solution {

public:

    int removeElement(vector<int>& nums, int val) {

        int len = nums.size();

        int slow = 0;

        int fast = 0;

        for(fast=0;fast<nums.size();fast++){

            if(val!=nums[fast]){

                nums[slow++] = nums[fast];//从头存不是val的值

            }

        }

        return slow;

    }

};

本题收获:双指针可以有效解决原始暴力解法的时间复杂度O(n^2),将其降为O(n),而且这道题一定要审题,不能额外的开辟一个数组,而且开辟了也没用,leecode后台的判题系统应该输出就是nums数组的值,获取不到其他数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值