LeetCode 33. 搜索旋轉排序數組(Java版)

題目

33. 搜索旋轉排序數組

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TXKHuWlS-1574951000373)(index_files/714bfc9a-fcd3-4570-9287-2624ca05a1df.png)]

題解

題目的重點的就是有點被旋轉了,而且時間複雜度O(logN)O(logN),所以這裏需要運用的就是而二分思想的。
我們要知道數組的最小值所在的地方,一般來說在左半邊還是右半邊。
舉個例子
1 最小值在左半邊
low = 0high = len - 1,所以 high 是 8
mid = low + ((high - low) >> 1),此時mid 是 4;
如果此時的target 是10。

16 18 2 4 6 8 10 12 14

因爲 nums[mid] < nums[low], 這裏的最小值在數組的左半邊,所以右邊半的是完全的遞增序列。所以只要判斷這個值是否不是在遞增裏面,就可以根據這個判斷來修改 lowhigh
此時mid 到high是遞增序列,所以需要確認10 是不是在這個遞增序列中,如果在,那麼就是low = mid + 1
如果不是,那麼high = mid+1

最小值在右半邊

8 10 12 14 16 18 2 4 6

因爲nums[mid] > nums[low], 這裏的最小值在數組的右半邊,所以這個 lowhigh 是遞增。
此時 midlow 是遞增序列,所以需要確認10 是不是在這個遞增序列中,如果在,那麼就是 high = mid - 1
如果不是,那麼 low = mid + 1

public int search(int[] nums, int target) {
	if (nums == null || nums.length == 0) {
		return -1;
	}
	int len = nums.length;
	int low = 0;
	int high = len - 1;
	int mid = 0;
	//
	while (low <= high) {
		mid = low + ((high - low) >> 1);
		if (nums[mid] == target) {
			return mid;
		// 旋轉點在右邊,
		} else if (nums[low] <= nums[mid]) {
			// 左邊都是遞增的,在遞增序列中。
			if (target >= nums[low] && target < nums[mid]) {
				high = mid - 1;
			} else {
				low = mid + 1;
			}
		// 旋轉點在左邊
		} else if (nums[low] > nums[mid]) {
			// 右邊都是遞增的,在遞增序列中
			if (target <= nums[high] && target > nums[mid]) {
				low = mid + 1;
			} else {
				high = mid - 1;
			}
		}
	}
	return -1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章