今天在公司午休时,做了到leetcode题,下班回家后又做了几道类似的题目,今天一共做了4道题啦!!!!!对二分算法也更深入的了解啦,不过那些时间复杂度还是有点搞不懂。一步一步来吧OvO.
题目是在搜索旋转排序数组;
假设一个升序的数组,在某一节点进行旋转,求给定数值的位置索引,若没有,则返回-1。
注意点:数组中不存在重复数据,算法时间复杂度必须是O(log n)。
示例1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
解释1:
0在数组中的位置是4,即nums[4]=0;
示例2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
解释2:
数组中没有3,返回-1;
题解:
这道题可以用二分来解决,分三种情况讨论:
第一种情况,中间值等于给定值,直接返回中间值;
第二种情况,右边有序,且给定值在右边,直接套用基本二分法来求给定值位置,
第三种情况,左边有序,且给定值在左边,也直接套用基本二分法来求给定值位置;
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package solution;
import java.util.*; import java.math.*;
class solution { public int search(int[] nums, int target) { int r = nums.length - 1; int l = 0; while (l <= r) { int mid = (r - l) / 2 + l; System.out.print(mid); if (nums[mid] == target) return mid; else if (nums[mid] < nums[r]) { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } else { if (target >= nums[l] && target < nums[mid]) r = mid - 1; else l = mid + 1; }
} return -1;
}
public static void main(String[] args) { solution s = new solution(); int[] b = { 4, 5, 6, 7, 0, 1, 2 }; int a = 0; System.out.print(s.search(b, a));
} }
|