第一题 LeetCode 704704. 二分查找https://leetcode-cn.com/problems/binary-search
package Day14.no1;
/**
* @author ahan
* @create_time 2021-09-26-2:21 下午
*/
public class 二分查找 {
public static void main(String[] args) {
int[] nums = {-1,0,3,5,9,12};
int target = 9;
int[] nums2 = {-1,0,3,5,9,12};
int target2 = 2;
二分查找 s = new 二分查找();
int search = s.search(nums, target);
int search2 = s.search(nums2, target2);
System.out.println(search);
System.out.println(search2);
}
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
while(l <= r){
int mid = (l + r)/2;
if(target == nums[mid]){
return mid;
}
if (target > nums[mid] ){
l = mid + 1;
}else{
r = mid - 1;
}
}
return -1;
}
}
第二题 LeetCode 278278. 第一个错误的版本https://leetcode-cn.com/problems/first-bad-version
left + right 容易溢出 left + (right - left) / 2就不会,(8 + 9) / 2 8 + (9 - 8) / 2 区别还是很大的!!
package Day14.no1;
/**
* @author ahan
* @create_time 2021-09-26-2:56 下午
*/
public class _278 {
public static void main(String[] args) {
_278 s = new _278();
System.out.println(s.firstBadVersion(5, 4));
System.out.println(s.firstBadVersion(3, 1));
System.out.println(s.firstBadVersion(4, 1));
System.out.println(s.firstBadVersion(2126753390 , 1702766719));
}
public int firstBadVersion(int n, int bad) {
int l = 0;
int r = n;
int mid;
while(l<r){
mid = l + (r - l) / 2;
if(!isBadVersion(mid, bad)){
l = mid + 1;
}else{
r = mid;
}
}
return l;
}
public boolean isBadVersion(int version,int bad ){
if (version >= bad)
return true;
return false;
}
}
第三题 LeetCode 3535. 搜索插入位置https://leetcode-cn.com/problems/search-insert-position
package Day14.no1;
/**
* @author ahan
* @create_time 2021-09-26-3:46 下午
*/
public class _35 {
public static void main(String[] args) {
int[] nums = {1,3,5,6};
int target = 5;
int target2 = 7;
_35 s = new _35();
int search = s.searchInsert(nums, target);
int search2 = s.searchInsert(nums, target2);
System.out.println(search);
System.out.println(search2);
}
public int searchInsert(int[] nums, int target) {
int l = 0, r = nums.length - 1,mid;
while(l<=r){
mid = l + (r - l) / 2;
if (target == nums[mid]){
return mid;
}
if(target < nums[mid]){
r = mid - 1;
}else {
l = mid + 1;
}
}
return l;
}
}
主要是学到了 mid 不要写成 (l+r)/2