合并两个有序数组
干!有一种很骚的办法,直接合并后,再用sort,芽儿哟!
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> ans;
int i = 0, j = 0;
while(i < m && j < n) {
if(nums1[i] > nums2[j]) {
ans.push_back(nums2[j]);
j++;
}
else {
ans.push_back(nums1[i]);
i++;
}
}
while(i < m) {
ans.push_back(nums1[i]);
i++;
}
while(j < n) {
ans.push_back(nums2[j]);
j++;
}
nums1 = ans;
}
};
第一个错误的版本
这是我直接想到的版本,直接超时!
class Solution {
public:
int firstBadVersion(int n) {
while(isBadVersion(n))n--;
return n + 1;
}
};
看了题解,要用二分查找的办法降低时间复杂度,很秀。思路就是,当mid为false时,说明左边有可能出现了第一个错误的版本(包括mid本身,因为mid可能就是第一个错误的版本)所以此时修改righr = mid;
当mid为true时,说明mid左侧包括mid都为true,所以修改left = mid + 1,再去二分查找。最后left和right指向的那个数,就是第一个出现错误的版本。
class Solution {
public:
int firstBadVersion(int n) {
return Binary(1, n);
}
int Binary(int left, int right) {
int mid;
while(left < right) {
mid = left + (right - left) / 2;
if(isBadVersion(mid)) { //返回值是true,说明是错误版本!我被这里坑了一下哈哈哈哈
right = mid;
}
else left = mid + 1;
}
return left;
}
};