1064. 不动点

题目

给定已经按升序排列、由不同整数组成的数组 A,返回满足 A[i] == i 的最小索引 i。如果不存在这样的 i,返回 -1

示例 1:

1
2
3
4
输入:[-10,-5,0,3,7]
输出:3
解释:
对于给定的数组,A[0] = -10,A[1] = -5,A[2] = 0,A[3] = 3,因此输出为 3 。

示例2:

1
2
3
4
输入:[0,2,5,8,17]
输出:0
示例:
A[0] = 0,因此输出为 0

示例3:

1
2
3
4
输入:[-10,-5,3,4,7,9]
输出:-1
解释:
不存在这样的 i 满足 A[i] = i,因此输出为 -1 。

提示:

  • 1 <= A.length < 10^4
  • -10^9 <= A[i] <= 10^9

解法

解法一:

暴力

JAVA

1
2
3
4
5
6
7
8
9
public int fixedPoint(int[] A) {
for (int i = 0;i < A.length;i++) {
if (A[i] == i) {
return i;
}
}

return -1;
}

解法二:

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int fixedPoint(int[] A) {
int left = 0, right = A.length;
while (left < right) {
int mid = left + (right - left) / 2;
if (A[mid] == mid) {
right = mid;
} else if (A[mid] < mid) {
//元素值小于索引值,增大left
left = mid + 1;
} else if (A[mid] > mid) {
//元素值大于索引值,减小right
right = mid;
}
}
if (left == A.length) return -1;
return left == A[left] ? left : -1;
}
0%