当前位置:  首页>> 技术小册>> 数据结构与算法(中)

题目描述

假设一个单调递增的数组里的每个元素都是整数并且是唯一的。

请编程实现一个函数找出数组中任意一个数值等于其下标的元素。

例如,在数组 [-3, -1, 1, 3, 5] 中,数字 3 和它的下标相等。

样例

  1. 输入:[-3, -1, 1, 3, 5]
  2. 输出:3

注意:如果不存在,则返回 -1。

解法

二分法查找。

  • 当前元素等于对应的下标,直接返回该下标;
  • 当前元素大于该下标,在左边查找;
  • 当前元素小于该下标,在右边查找。
  1. /**
  2. * @author bingo
  3. * @since 2018/12/10
  4. */
  5. class Solution {
  6. /**
  7. * 找出单调递增数组中数值和下标相等的元素
  8. *
  9. * @param nums 数组
  10. * @return 数值与下标相等的元素
  11. */
  12. public int getNumberSameAsIndex(int[] nums) {
  13. if (nums == null || nums.length == 0) {
  14. return -1;
  15. }
  16. int start = 0, end = nums.length - 1;
  17. while (start <= end) {
  18. int mid = start + ((end - start) >> 1);
  19. if (nums[mid] == mid) {
  20. return mid;
  21. }
  22. if (nums[mid] < mid) {
  23. start = mid + 1;
  24. } else {
  25. end = mid - 1;
  26. }
  27. }
  28. return -1;
  29. }
  30. }

测试用例

  1. 功能测试(数组中包含或者不包含数值和下标相等的元素);
  2. 边界值测试(数组中只有一个数字;数值和下标相等的元素位于数组的开头或者结尾);
  3. 特殊输入测试(表示数组的指针为空指针)。

该分类下的相关小册推荐: