> 文档中心 > 《五月集训》(第九天)——二分查找

《五月集训》(第九天)——二分查找


前言:

五月集训,前面为学习内容,想要一起学习的可以看一看,最后的才是五月集训每天的作业

一、知识点

二分查找普通用法就是在一个有序数组中,一头一尾不断向中间逼近目标值,已达到降低复杂度的目的。

二、课堂习题

这里的题均出自《算法零基础100讲》
着急学习的同学去看专栏吧!!!

三、作业

35. 搜索插入位置
704. 二分查找
剑指 Offer 53 - I. 在排序数组中查找数字 I
911. 在线选举
解题思路:
1.模板题,定义一个变量存储结果,不断二分查找即可;
2.同上,多一步判断找到的元素是否与目标值相等;
3.找到目标值的位置,然后再找到比目标值大一个的位置,两个值相减即是目标值的数量;
4.这题看的大佬们的题解思路(等有空会自己补的ORZ),简单来说就是将每个时间的胜利者统计出来,然后二分查找对应的时刻。
代码:

class Solution {    public int searchInsert(int[] nums, int target) { int l = 0,r = nums.length-1; int ans = nums.length; while(l <= r){     int mid = (l+r)>>1;     if(nums[mid] >= target){  ans = mid;  r = mid - 1;     }else{  l = mid + 1;     } } return ans;    }}
class Solution {    public int search(int[] nums, int target) { int n = nums.length; int l = 0,r = n - 1; int ans = n; while(l <= r){     int mid = (l+r) >> 1;     if(nums[mid] >= target){  ans = mid;  r = mid - 1;     }else{  l = mid + 1;     } } if(ans == n){     return -1; }else if(nums[ans] != target){     return -1; } return ans;    }}
class Solution {    public int search(int[] nums, int target) { int n = nums.length; int index = bSearch(nums,n,target); if(index == n || nums[index] != target){     return 0; } return bSearch(nums,n,target+1) - index;    }    public int bSearch(int[] nums,int n,int target){ int l = 0,r = n - 1; int ans = n; while(l <= r){     int mid = (l+r)>>1;     if(nums[mid] >= target){  ans = mid;  r = mid - 1;     }else{  l = mid + 1;     } } return ans;    }}
class TopVotedCandidate {    List<int[]> list = new ArrayList<>();    public TopVotedCandidate(int[] persons, int[] times) { int val = 0; Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < times.length; i++) {     map.put(persons[i], map.getOrDefault(persons[i], 0) + 1);     if (map.get(persons[i]) >= val) {  val = map.get(persons[i]);  list.add(new int[]{times[i], persons[i]});     } }    }    public int q(int t) { int l = 0, r = list.size() - 1; while (l < r) {     int mid = l + r + 1 >> 1;     if (list.get(mid)[0] <= t){  l = mid;     }else{  r = mid - 1;     }  } return list.get(r)[0] <= t ? list.get(r)[1] : 0;    }}/** * Your TopVotedCandidate object will be instantiated and called as such: * TopVotedCandidate obj = new TopVotedCandidate(persons, times); * int param_1 = obj.q(t); */

四、总结

对于算法的掌握还是不够熟练,需要进行反复训练!
另外,剩下的课堂训练题目留到下个月的集训啦(●ˇ∀ˇ●)