到第三题啦
题目
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
开始写的代码
(额,,,没写出来,我太菜了,,,)
大佬指导过后的代码
方法一:
package src;
public class three01 {
public static void main(String[] args) {
//有序数组
int []nums = {1,2,4,6,7,9};
System.out.println(find(nums,10));
}
public static int find(int []nums,int number) {
for(int i = 0;i<nums.length;i++) {
if(nums[i] >= number) {
return i;
}
}
return nums.length;
}
}
方法二:
package src;
public class three02 {
public static void main(String[] args) {
//有序数组
int[] nums = {1, 2, 4, 6, 7, 9};
System.out.println(find(nums, 10));
}
public static int find(int[] nums, int number) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] == number) {
return i;
}
if (nums[i] >= number) {
return i;
}
}
return nums.length;
}
}
方法三(二分查找):
package src;
public class three03 {
public static void main(String[] args) {
int[] nums = {1, 2, 4, 6, 7, 9};
System.out.println(find(nums, 10));
}
public static int find(int[] nums, int target) {
int lo = 0;
int hi = nums.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (target < nums[mid])
hi = mid - 1;
else if (target > nums[mid])
lo = mid + 1;
else return mid;
}
return lo;
}
}
运行结果:
补充:
1. 循环中的转跳语句
- break:break语句可以让程序强行跳离switch语句或循环语句,将控制权交给分支语句或者循环语句后面的语句,一般用于使switch语句终止某个case或是是一个循环立即结束。
- continue:continue语句必须用在循环结构中,作用是终止当前这一轮的循环,跳出本轮循环剩余的语句,直接进入下一轮循环。
- return:return语句用来使程序从方法中返回,并为方法返回一个值,如果return语句没有出现在方法中,则执行完方法的最后一条语句后自动返回到主程序。
2.二分查找部分内容
- 使用lo + (hi - lo) / 2 是为了防止mid越界,且默认向下取整。
- 二分查找针对的是一个有序的数据集合也就是数组(这也成为了二分查找的一个重要局限性),查找思想有点类似分治思想。
- 每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。