首页 > 其他分享 >day01【704. 二分查找,35.搜索插入位置 ,27. 移除元素 】

day01【704. 二分查找,35.搜索插入位置 ,27. 移除元素 】

时间:2023-05-24 23:44:41浏览次数:71  
标签:27 nums 704 middle int right 移除 查找 left

704. 二分查找

二分查找理论

二分查找是一个时间效率极高的算法,尤其是面对大量的数据时,其查找效率是极高,时间复杂度是log(n)。
主要思想就是不断的对半折叠,每次查找都能除去一半的数据量,直到最后将所有不符合条件的结果都去除,只剩下一个符合条件的结果。

二分查找需要的条件

  • 用于查找的内容逻辑上来说是需要有序的
  • 查找的数量只能是一个,而不是多个

因为查找的区间是不断迭代的,所以确定查找的范围十分重要,主要就是左右区间的开和闭的问题,开闭不一样,对应的迭代方式也不一样,有以下两种方式:

 

左闭右闭[left, right] 左闭右开[left, right)

左闭右闭

 1 class Solution {
 2     public int search(int[] nums, int target) {
 3        if(target<nums[0]||target>nums[nums.length-1]){
 4            return -1;
 5        } 
 6         int left = 0;
 7         int right = nums.length-1;
 8         while(left<=right){
 9             int middle = left + ((right-left)/2);
10             if(nums[middle]>target){
11                 right = middle - 1;
12             }else if(nums[middle]<target){
13                 left = left + 1;
14             }else{
15                 return middle;
16             }
17         }
18         return -1;
19     }
20 }

左闭右开

 1 class Solution {
 2      public int search (int[] nums,int target){
 3         if(target<nums[0]||target>nums[nums.length-1]){
 4            return -1;
 5        }   
 6     int left = 0;
 7     int right = nums.length-1; 
 8     while (left < right) {    
 9         int middle = left + ((right - left) / 2);
10         if (nums[middle] > target) {
11             right = middle; 
12         } else if (nums[middle] < target) {
13             left = middle + 1;
14         } else {
15             return middle;
16         }
17     } 
18     return -1;
19 }
20     

同类题 35.搜索插入位置 

 1 class Solution {
 2     public int searchInsert(int[] nums, int target) { 
 3             if(nums[0]>target){
 4                 return 0;
 5             }else if (nums[nums.length-1]<target){
 6                 return nums.length;
 7             }else {
 8             int left = 0;
 9             int n =0;
10             int right = nums.length-1;
11             while(left<=right){
12                 int middle = left + ((right -left)/2);
13                 if(target>nums[middle]){
14                     left = middle + 1;
15                 }else if (target<nums[middle]){
16                     right = middle - 1;
17                 }else 
18                     return middle;
19             }
20         return right+1;}            
21 }
22 }

难点:最后为什么是return right+1;

原因:当不再进入while里面的时候一定是right<left.而且此时数组里面也匹配不到与target相等的数。所以它要插入的位置一定是此时left 和right之间。但更小的是right,所以插入的位置就在right+1.

  27. 移除元素

思路:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作

  • 快指针:寻找 新数组(不含目标元素) 中的元素
  • 慢指针:指向更新新数组下标的位置,等待加入快指针找到符合要求的数
 1 class Solution {
 2     public int removeElement(int[] nums, int val) {
 3         int slowIndex = 0;
 4         for(int fastIndex = 0; fastIndex < nums.length; fastIndex++){
 5             if(nums[fastIndex]!=val){
 6                 nums[slowIndex++]=nums[fastIndex];
 7             }
 8         }
 9         return slowIndex;
10     }
11 }

 

 

 

标签:27,nums,704,middle,int,right,移除,查找,left
From: https://www.cnblogs.com/adelall/p/17429895.html

相关文章

  • 做题记录(5.21~5.27)
    5.21口胡了UOJEasyRound1,想了大约20minUOJ12考虑到\(a=a_1g,b=b_1g\),那么\(gl=ab=a_1b_1g^2\),因此\(g|l\),设\(l=l_1g\),则有\(a_1b_1=l_1\),而\(a+b=g(a_1+b_1)\),显然\(a_1+b_1\)最大值是\(1+l_1\),最小值是\(2\sqrt{l_1}\)(\(l_1\)也是一个完全平方数)则\(a+b\)......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums=[-1,0,3,......
  • [Error 10048] error while attempting to bind on address (‘127.0.0.1‘, 8000):
    今天运行程序的时候碰到了这么个问题,因为之前也遇到过这种情况,那时找不到原因重启电脑这方法偶尔能解决,今天就不行了,电脑又没有看到明显的占用这个端口的程序。所以查找资料从根源出发解决。解决方法是:1.进入命令行(以管理员身份)2.输入netstat-aon|findstr"8000"查找8000端......
  • AT_abc_272_e 总结
    题意给定长度为\(n\)的数组\(a_i\)。执行操作\(m\)次,每次操作将\(a_i\)加上\(i\),对于每操作求出,最小的非负整数,使得\(A\)不包含它。数据范围:\(1\len\le2\times10^5,1\lea_i\le10^9\)。思路首先当\(0\lea_i<n\)时,\(a_i\)对答案才会有影响......
  • kubernetes v1.27.2安装并配置calico网络为BGP模式
    1.集群信息机器均为2C4G的虚拟机,硬盘为60G,系统版本均为centos7.9IPHostnameOSblade192.168.63.61master.sec.comcentos7.9master192.168.63.62node01.sec.comcentos7.9worker192.168.63.63node02.sec.comcentos7.9worker2.基础系统配置2.1.主......
  • AT_abc_271_f 总结
    题目:AT_abc_271_f链接:洛谷,AT,vjudge题意有\(n\timesn\)的矩阵\(a_{i,j}\),问有几条从\((1,1)\)走到\((n,n)\)且异或和为\(0\)的方案数。数据范围:\(2\len\le20,0\lea_{i,j}\le2^{30}\)。......
  • abc273_e Notebook 题解
    Notebook题意有\(q\)次操作。现在你有一个空序列\(a\)和一本\(10^9\)页的笔记本,每页纸上都有一个空序列。每次操作是以下四种中的一种:ADDx,表示在\(a\)的末尾插入一个整数\(x\)。DELETE,表示删除\(a\)的末尾的一个数,如果\(a\)序列为空则什么也不干。SAVEy,表......
  • CodeForces 1827E Bus Routes
    洛谷传送门CF传送门比较神奇的题。定一个非叶子\(r\)为根。显然只用判断两个叶子是否可达。求出每个叶子向上能一步跳到的深度最浅的点\(p_i\),那么如果\(p_i\)不在一条链上就无解,因为两条路径没有交点。然后只用判断\(p_i\)最深的叶子的\(p_i\)能不能一步到达其他......
  • poj-2707
    //408K0MSG++#include<cstdio>#include<cstring>usingnamespacestd;intoX;intoY;intdX;intdY;inlinedoubleMIN(doublea,doubleb){returna<b?a:b;}inlinedoubleMAX(doublea,doubleb){returna>b?......
  • 算法刷题记录:NC22227 约瑟夫环
    题目链接https://ac.nowcoder.com/acm/problem/22227解题思路模拟环。这道题顺序数就行,顺序是逆时针,逆时针的箭头是往左拐的,变成直线后趋于正半轴所以是+。不过,这道模拟环并没有说从idx号开始,往左/右数几个人,所以不需要考虑+或-。因为不会越界,所以也不用额外%n。AC代码......