合并两个有序数组
干!有一种很骚的办法,直接合并后,再用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;}
};