描述:
在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回 -1。
测试样例:
样例
样例 1:
输入:nums = [1,2,2,4,5,5], target = 2
输出:1 或者 2
样例 2:
输入:nums = [1,2,2,4,5,5], target = 6
输出:-1
分析:
看完题目描述,我立马想到了循环遍历,找到数组中第一个和目标值相同的值返回下标值即可
public int findPosition(int[] nums, int target) {
// write your code here
if(nums==null){
return -1;
}
for(int i=0;i<nums.legnth;i++){
if(nums[i]==target){
return i;
}
}
return -1;
}
时间复杂度是O(n),所以头提交之后报超时了,然后又好好看了一遍题目,时间复杂度要求是O(logn) ,并且给定的数组是有序的,不要求数组的值和目标值相同的时候返回的下标值是第几个,那使用二分查找,确定左边界值head(开始为0)和右边界值tail(数组的长度-1),计算出中间值mid=(tail+head)/2,将中间值和目标值比较,大于中间值则将区间缩小到中间值右边区间,左边界值变成mid+1;小于中间值则将区间缩小到左边区间,右边界值变成mid-1;如果刚好中间值等于目标值,则返回下标值即可;查找到最后,如果中间值超出边界值了还没找到,则返回-1;
解决方案:
给出代码如下:
我用的是循环,有兴趣的小伙伴也可以自己写递归函数
public class Solution {
/**
* @param nums: An integer array sorted in ascending order
* @param target: An integer
* @return: An integer
*/
public int findPosition(int[] nums, int target) {
// write your code here
if(nums==null){
return -1;
}
int head=0;
int tail=nums.length-1;
int mid=(head+tail)/2;
while(mid>=head&&mid<=tail){
if(target==nums[mid]){
return mid;
}
if(target<nums[mid]){
tail=mid-1;
}
if(target>nums[mid]){
head=mid+1;
}
mid=(tail+head)/2;
}
return -1;
}
}
提交结果: