題目:一個數組,前段是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;
}
總結:
樹形結構題目要想到利用分治法
箴言錄
人孰無過?過而能改,善莫大焉。