高頻算法面試題學習總結----樹形結構1:尋找變化

題目:一個數組,前段是0, 後段是1。你能否找到, 出現的第一個1。

輸入1: nums = {0, 0, 0, 1, 1, 1, 1}
輸出1: 3
輸入2: nums = {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}
輸出2: 2

思路1:遍歷,時間複雜度O(n)

思路2:分治,採用二分搜索,時間複雜度O(logn)

實現代碼:

#include<iostream>
#include<vector>

using namespace std;

int FirstOne(vector<int> nums)
{
	int l = 0;
	int r = nums.size() - 1;
	if (nums.empty() || nums[r] == 0)
		return -1;
	while (l < r) {
		int m = l + (r - l) / 2;
		if (nums[m]) {
			r = m;
		}
		else {
			l = m + 1;
		}
	}
	return l;
}
int main()
{

	cout << FirstOne({ 0,0,0,1,1,1,1 }) << endl;
	cout << FirstOne({ 0,0,0 }) << endl;
	cout << FirstOne({ 1,1,1,1 }) << endl;
	cout << FirstOne({ }) << endl;

	return 0;
}

總結:

樹形結構題目要想到利用分治法

 

箴言錄

人孰無過?過而能改,善莫大焉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章