合并两个有序数组
思路:利用一个队列合并,最后逐一出队到nums1中。
AC代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
queue<int> numbers;
int p1=0,p2=0;
while(p1<m&&p2<n)
{
if(nums1[p1]<nums2[p2])
{
numbers.push(nums1[p1++]);
}
else
numbers.push(nums2[p2++]);
}
while(p1<m)
{
numbers.push(nums1[p1++]);
}
while(p2<n)
{
numbers.push(nums2[p2++]);
}
for(int i = 0;!numbers.empty();i++)
{nums1[i] = numbers.front();
numbers.pop();}
}
};
第一个错误的版本
思路:二分查找的变形
注意:mid取整数时好像可能会overflow,可能是因为两个int之和有可能不能用int表示。
AC代码:
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
//找到第一个true.p1是小于等于第一个错的下标,p2大于等于第一个错的下标
long p1 = 1,p2=n;
while(p1<=p2)
{
if(p1==p2) return p1;
long mid = (p1+p2)/2;
bool flag = isBadVersion(mid);
if(flag==false)
p1 = mid+1;
else
p2 = mid;
}
return -1;
}
};