import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整型 * @return int整型 */ public int search(int[] nums, int target) { if (nums == null || nums.length == 0) { return -1; } int left = 0; int right = nums.length - 1; while (left <= right) { int mid = (right + left) >> 1; if (nums[mid] == target) { // 向左寻找最小索引 while (mid > 0 && nums[mid - 1] == target) { mid--; } return mid; // 说明左半边有序 } if (nums[mid] > nums[left]) { // 如果目标在左边界 if (target >= nums[left] && target < nums[mid]) { right = mid - 1; } else { left = mid + 1; } }// 说明右半边有序 else if (nums[mid] < nums[left]) { // 如果目标在右边界 if (target > nums[mid] && target <= nums[right]) { left = mid + 1; } else { right = mid - 1; } }// 左边和中间相等,无法判断有序,需要进行削减区间 else { left++; } } return -1; } }
本题知识点分析:
1.二分查找
2.数学模拟
3.双指针
本题解题思路分析:
1.本题虽然说没有相同的值,也就是难度降低,不用寻找最左的相同值
2.我用的通用的方法变式
3.如果相等,向左寻找最小的索引
4.如果左半边有序,然后判断元素在有序的一边还是另一边
5.右半边同理
6.如果中间元素和left元素相等,无法判断,left++进行缩容,但本题不用,因为明确是不同的值
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~