0
点赞
收藏
分享

微信扫一扫

指定元素第一次出现位置


题目

指定元素第一次出现位置_有序数组


一个有序数组,实现一个查找函数,找出指定元素在数组中第一次出现的位置

思路:立马就想到二分,因为返回的是第一次出现的位置,所以还得和前面的数比较一下

public class Solution {

public static void main(String[] args) {
Solution solution = new Solution();
int[] array = {1, 1, 1, 4};
int num = solution.firstIndex(array, 1);
// 0
System.out.println(num);
}

public int firstIndex(int[] array, int search) {
int index = binarySearch(array, search);
if (index == -1) {
return -1;
}
while (index > 0) {
if (array[index] == array[index-1]) {
index--;
} else {
break;
}
}
return index;
}

public int binarySearch(int[] array,int search) {
int start = 0;
int end = array.length - 1;
while (start <= end) {
int mid = (start + end) >> 1;
if (array[mid] == search) {
return mid;
} else if (search > array[mid]) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
}

面试官:时间复杂度最坏为多少?
我:O(n)
面试官:还能优化吗?
我:…
面试官:相等的时候还能二分吗?
我:可以

所以正确答案就是这样的

public class Solution {

public static void main(String[] args) {
Solution solution = new Solution();
int[] array = {0, 1, 1, 1, 3, 4};
int num = solution.binarySearch(array, 3);
// 4
System.out.println(num);
}

public int binarySearch(int[] array,int search) {
int start = 0;
int end = array.length - 1;
while (start <= end) {
int mid = (start + end) >> 1;
if (array[mid] == search) {
if (mid == start || array[mid - 1] != search) {
return mid;
} else {
end = mid - 1;
}
} else if (search > array[mid]) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
}


举报

相关推荐

0 条评论