给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 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
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
相关标签
Java
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
This method must return a result of type int
报错原因:如果都不满足条件的话,那么就没有返回值了,不符合。
参考见java 报错 This method must return a result of type int
另:
1.本思路和题目要求不符,请必须使用时间复杂度为 O(log n) 的算法。
2.当target大于所有的数时,则没有<nums[i],需要修改。
package Day1;
public class Test2 {
public static int searchInsert(int[] nums, int target) {
int a=nums.length;
int i=0;
if(target<=nums[0])
return 0;
if(target>nums[a-1])
return a;
for(i=1;i<a;i++) {
if(target==nums[i])
return i;
else {
if(target<nums[i]&&target>nums[i-1])
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums= {1,3,5,6};
int target=5;
int target1=2;
int target2=7;
System.out.println(searchInsert(nums,target));
System.out.println(searchInsert(nums,target1));
System.out.println(searchInsert(nums,target2));
}
}
在原有思路是完善如上,对其大于数组中所有的数进行了增加,对于返回值必须是int型,则在最后添加return -1,因为从逻辑上来说是一定会在if的语句中有return的。可能不太完美,但这是目前能想到的办法。
遇到的问题,本来想用if-else if-else 语句对target>nums[a-1]进行完善的,但是又出现新的问题,当target==nums[i]时,没法return i;而是return a;
仔细琢磨,哈哈哈哈哈哈哈哈。
小结:
1.Java编译中,函数返回必须要有,直愣愣的要有,在if里面的不算
2.瞻前顾后,考虑特殊情况,0,和length-1时,
3.逐步调试很重要!
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int middle = left + (right - left) / 2;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] < target) {
left = middle + 1;
} else if (nums[middle] > target) {
right = middle -1;
}
}
return left;
}
}
参考答案↑这不就是二分查找嘛! 请必须使用时间复杂度为 O(log n) 的算法。