开篇:
二分查找(Binary Search)又叫折半查找,对于已排序的数组,是一种非常高效的排序算法,二分查找很简单也高效,但是在刷力扣的时候我好多题都想不到用二分查找的方法去做。今天就说说那些题都可以二分查找。
正文:
704.二分查找
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
代码:
class Solution {
public int search(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while (low <= high) {
int mid = (high - low) / 2 + low;
int num = nums[mid];
if (num == target) {
return mid;
} else if (num > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
}
35.搜索插入位置
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
代码:
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)/2;
if(nums[mid]>=target){
ans=mid;
r=mid-1;
}else{
l=mid+1;
}
}
return ans;
}
}
69.x的平方根
题目描述:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
代码:
class Solution {
public int mySqrt(int x) {
long l=0,r=10000000;
long ans=0;
while(l<=r){
long mid=(r+l)/2;
if(mid*mid<=x){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
return (int)ans;
}
}
367.有效的完全平方数
题目描述:
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
代码:
class Solution {
public boolean isPerfectSquare(int num) {
long l=0,r=1000000;
long ans=0;
while(l<=r){
long mid=(l+r)/2;
if(mid*mid<=num){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
return ans*ans==num;
}
}
结尾:
相信说了这么多你一定找到了规律,还有一些题你们练练手:
441.排列硬币
34. 在排序数组中查找元素的第一个和最后一个位置