LeetCode——二分法

二分法模板:

public calss Solution{
	public int search(int[] nums,int target){
		int len=nums.length;
		int left=0;
		int right=len-1;
		while(left<right){//在退出循环的时候,一定有left==right成立,此时返回left或者right都可以
			int mid=(left+right+1)>>>1;//先取左中位数,以后根据分支的逻辑,决定是否要修改成右中位数
			if(nums[mid]>target){
				right=mid-1;
			}else{
				left=mid;//左边界不收缩
			}
		}
		if(nums[left]==target){
			return left;
		}
		return -1;
	}
}

在循环内只写两个分支,一个分支排除中位数,另一个分支不排除中位数,循环中不单独对中位数作判断。存在两个模板代码:

if(排除中位数的逻辑){
	left=mid+1;//目标元素至少是中位数,但不包括中位数
}else{
	right=mid;//目标元素之多是中位数,有可能取到中位数
}

if(排除中位数的逻辑){
	right=mid-1;//目标元素至多是中位数,但不包括中位数
}else{
	left=mid;//目标元素至少是中位数,有可能取到中位数
}

如何选择是左中位数还是右中位数?
1、如果分支的逻辑,在选择左边界的时候,不能排除中位数,那么中位数就选“右中位数”,只有这样区间才会收缩,否则进入死循环
2、同理,如果分支的逻辑,在选择右边界的时候,不能排除中位数,那么中位数就选“左中位数”,只有这样区间才会收缩,否则进入死循环

旋转数组

33.搜索旋转排序树组
81.搜索旋转排序数组II
153.寻找旋转排序数组中的最小值

搜索二维矩阵

74.搜索二维矩阵
240.搜索二维矩阵II

其他

300.最长上升子序列(DP+二分查找->O(N)=NlogN)
658.找到K个最接近的元素
911.在线选举
718.最长重复子数组
378.有序矩阵中第K小的元素
497.非重叠矩形中的随机点
475.供暖器
167.两数之和II—输入有序数组
287.寻找重复数
704.二分查找
209.长度最小的子数组
69.x的平方根
1011.在D天内送达包裹的能力
162.寻找峰值
981.基于时间的键值存储
222.完全二叉树的节点个数
50.Pow(x,n)
436.寻找右区间
349.两个数组的交集
350.两个数组的交集II
34.在排序数组中查找元素的第一个和最后一个位置
528.按权重随机选择
454.四数相加II
392.判断子序列
29.两数相除
374.猜数字大小
275.H指数II
278.第一个错误的版本
367.有效的完全平方数
441.排列硬币
35.搜索插入位置
744.寻找比目标字母大的最小字母
852.山脉数组的峰顶索引

发布了107 篇原创文章 · 获赞 19 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/ThreeAspects/article/details/103658272