首页 > 编程语言 >代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素

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

时间:2024-07-03 20:42:17浏览次数:1  
标签:27 target nums int 随想录 mid right 移除 left

704. 二分查找

这个之前有写过,最重要的就是把握住要去搜索的区间的形式,包括左闭右闭以及左闭右开两种

class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length;
        while(left < right){  // 左闭右开的版本,结果存储在[left, right)中,因此如果最终left >= right,就意味着没有找到结果
            int mid = (left + right) / 2;
            if(nums[mid] > target) { right = mid; }  // 结果在区间[left, mid)
            else if(nums[mid] == target){ return mid; }  
            else{ left = mid + 1; }  // 结果在区间[mid + 1, right)
        }
        return -1;
    }
}

class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while(left <= right){  // 左闭右闭的版本,结果存储在[left, right]中,只有left > right,意味着没有找到结果
            int mid = (left + right) / 2;
            if(nums[mid] > target) { right = mid - 1; }
            else if(nums[mid] == target){ return mid; }
            else{ left = mid + 1; }
        }
        return -1;
    }
}

34. 在排序数组中查找元素的第一个和最后一个位置

思想还是二分查找,但分为两个步骤,分别去找最左边的和最右边的。二分查找我觉得还是先以一种方法去做吧,比如就只用左闭右闭的方式,这样可以避免自己混乱。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        return new int[] {findLeft(nums, target), findRight(nums, target)};
    }

    public int findLeft(int[] nums, int target){
        int left = 0, right = nums.length - 1;
        int ans = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) { left = mid + 1; }
            else if(nums[mid] == target) { 
                ans = mid;
                right = mid - 1;  // 找到target后,因为要找最左边的,所以搜索空间向左压缩
            }else{
                right = mid - 1;
            }
        }
        return ans;
    }

    public int findRight(int[] nums, int target){
        int left = 0, right = nums.length - 1;
        int ans = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) { left = mid + 1; }
            else if(nums[mid] == target) { 
                ans = mid;
                left = mid + 1;  // 同理,向右压缩搜索区间
            }else{
                right = mid - 1;
            }
        }
        return ans;
    }
}

27. 移除元素

我的直观想法就是每遇见一个等于val的元素,就将其换到数组的末尾,此时换过来的元素还没有判断,因此left不动,但换到结尾的元素一定要被删除,因此right--;遇见不等于val的,不需要交换,left++即可;最终left会停止在数组最后一个合法元素的下一个元素,其下标刚好为最终数组的长度

class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0, right = nums.length - 1;
        while(left <= right){
            if(nums[left] == val){
                nums[left] = nums[right];
                nums[right] = val;
                right -= 1;
            } else{
                left += 1;
            }
        }
        return left;
    }
}

今天这些题自己之前有做过,所以做起来还算得心应手,没有完全忘掉。但还是一点,刚开始二分查找就先记得用左闭右闭的方法去做,其实基本上大部分的题就套用模板,不要给自己增添别的负担最好。

标签:27,target,nums,int,随想录,mid,right,移除,left
From: https://www.cnblogs.com/12sleep/p/18282527

相关文章

  • 2736 卡片重排
    题目描述Description可可共有两种卡片,一种卡片是数字0-9编号,一种卡片是字母A-Z编号,现在两种卡片混在一起,可可想将它们归类摆放,但是要求同类卡片中,它们相对位置不可以改变,原先在前的仍然在前,具体规则还可参考样例理解。输入描述InputDescription一行,若干数字及字母,中间无......
  • YC309A [ 20240627 CQYC省选模拟赛 T1 ] 或(or)
    题意给定一个可重集\(S\),求所有的前缀的集合的代价。定义一个集合的代价为:\[\max_x\left((\max_ib_i\lvertx)-(\min_ib_i\lvertx)\right)\]\(n\le10^6,V\le2\times10^6\)Sol首先看到这个式子直接开划。称较大的数为\(b_i\),较小的数为\(b_j\)。直......
  • 代码随想录算法训练营第四十六天 | 买卖股票的最佳时机
    121.买卖股票的最佳时机题目链接文章讲解视频讲解动规五部曲:dp[j][0]:表示持有股票的最大现金,dp[j][1]表示不持有股票的最大现金递推公式:第j天持有股票的最大现金为:之前就持有这只股票和今天持有这只股票取最大值:dp[j][0]=max(dp[j-1][0],-prices[j]);第j天不持有......
  • SOMEIPSRV_FORMAT_27:类型2条目的“保留字段”
    测试目的:验证类型2条目中跟随TTL字段之后的Reserved字段是否被静态设置为0x0000。描述本测试用例旨在确保SOME/IP服务发现协议中,类型2条目格式布局中跟随TTL字段之后的Reserved字段被正确地静态设置为0x0000,特别是对于SubscribeEventgroupAck消息。测试拓扑:具体步骤:D......
  • 代码随想录算法训练营第四十五天 | 打家劫舍
    198.打家劫舍题目链接文章讲解视频讲解dp[j]:表示投到第j家最多能偷dp[j]的钱递推公式:dp[j]=max(dp[j-2]+nums[j],dp[j-1])初始化:dp[0]=nums[0],dp[1]=max(dp[0],dp[1])遍历顺序:从小到大打印dp数组classSolution{public:introb(vector<int>&n......
  • [IOT2050 question] Unable to listen on http://127.0.0.1:1880/ 端口被占用错误
    1.背景第一次连接node-red的时候,一直出现错误Unabletolistenonhttp://127.0.0.1:1880/。如下:2.原因分析估计是早前利用iot2050setup小工具把node-red设置为开机自动启动项了,导致1880端口一直被占用。3.验证首先查看端口是否真的被占用,利用sudonetstat-ltup命......
  • 数组-移除元素
    移除元素移除元素(leetcode27)varremoveElement=function(nums,val){constn=nums.length;letleft=0;for(letright=0;right<n;right++){if(nums[right]!==val){nums[left]=nums[right];left++......
  • 27_方法的重写
    07_方法的重写子类重写父类的方法静态方法等级较高,不算重写publicclassApplication{publicstaticvoidmain(String[]args){Aa=newA();a.test();//Atest//父类B的引用指向子类ABb=newA();b.test();//Bt......
  • 【SPIE独立出版】第三届智能机械与人机交互技术学术会议(IHCIT 2024,7月27)
    由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT2024)将定于2024年7月27日于中国杭州召开。大会面向基础与前沿、学科与产业,旨在将“人工智能”、“智能系统”和“人机交互”等学......
  • 代码随想录算法训练营第四十四天 | 322.零钱兑换 279.完全平方数 139.单词拆分
    322.零钱兑换题目链接文章讲解视频讲解classSolution{public:intcoinChange(vector<int>&coins,intamount){//dp[j]:表示能凑成面额j所需的最少硬币个数vector<int>dp(amount+1,0);//递推公式:dp[j]=min(dp[j-coins[i]......