[Leetcode]Search for a Range

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,

return [3, 4].

 這道題目的是讓找到目標元素所在的範圍,要求複雜度是O(lgn),因此不能使用線性的查找方法,這裏用二叉查找法。

首先求mid元素,結果分爲三種情況:

A[mid]>target:搜尋left~mid範圍;

A[mid]<target:搜尋mid~right範圍;

A[mid]==target:以mid爲分界點,向左向右分別採用二叉查找法尋找目標元素的頭和尾。、

如果沒有找到目標元素,則返回[-1,-1].

算法實現如下:

class Solution {
public:
	vector<int> searchRange(int A[], int n, int target) {
		int left = 0, right = n - 1;
		vector<int> result;
		while (left <= right){
			int mid = (left + right) >> 1;
			if (A[mid] == target){
				int head = searchHead(A,left,mid,target);
				result.push_back(head);
				int end = searchEnd(A,mid,right,target);
				result.push_back(end);
				return result;
			}
			else if(A[mid] < target){
				left = mid + 1;
			}
			else{
				right = mid - 1;
			}
		}
		result.push_back(-1);
		result.push_back(-1);
		return result;
	}
	int searchHead(int A[], int left, int right, int target){   //尋找第一個目標元素的位置
		if (left == right)  return left;<span style="white-space:pre">			</span>
		if (left == right - 1){<span style="white-space:pre">				</span>//只要上層函數mid右側有大於2個元素,那遞歸的最後肯定只剩下2個元素
			if (A[left] == target) return left;<span style="white-space:pre">	</span>//所以要判斷這連個元素是不是target,不加這一步判斷就會陷入死循環
			else return right;
		}
		int mid = (left + right) >> 1;
		if (A[mid] == target){
			return searchHead(A, left, mid, target);
		}
		else{
			return searchHead(A, mid, right, target);
		}
	}
	int searchEnd(int A[], int left, int right, int target){     //尋找最後一個目標元素的位置
		if (left == right) return left;
		if (left == right-1){
			if (A[right] == target) return right;
			else return left;
		}
		int mid = (left + right) >> 1;
		if (A[mid] == target){
			return searchEnd(A, mid, right, target);
		}
		else{
			return searchEnd(A, left, mid, target);
		}
	}
};


發佈了35 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章