leetcode之排序和搜索
2019-06-20 本文已影响0人
HugiFish
1. 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
解题思路:一般像这种数组有插入操作的基本上都会用到尾插法,比较的同时也完成了移动。直接在尾部比较,较大的插入num1的尾部,然后插入位置前移。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(0 == n ) return;
int newIndex = m + n - 1;
int i1 = m-1;
int i2 = n-1;
while( i1 != -1 && i2!=-1){
if(nums1[i1]>= nums2[i2]){
nums1[newIndex] = nums1[i1];
--i1;
--newIndex;
}else{
nums1[newIndex] = nums2[i2];
--i2;
--newIndex;
}
}
while(-1 != i2)
{
nums1[i2] = nums2[i2];
--i2;
}
}
2. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
- 示例:
给定 n = 5,并且 version = 4 是第一个错误的版本。
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
解题思路:题中要求比较次数最少,那么可以采用二分查找的方法进行比较,二分到最后,min一定会停留在第一个错误的版本,并且max一定停留在最后一个正确的版本。
注意:有一项是值得注意的,如果采用max+min/2计算mid时,一定要使用unsigned int版本的下标,否则会出现溢出的情况。
int firstBadVersion(int n) {
int min = 1, max = n, mid = 0;
while(min <= max){
mid = min + (max - min) / 2;
if(isBadVersion(mid)){
max = mid - 1;
} else {
min = mid + 1;
}
}
return min;
}