美文网首页
leetcode之排序和搜索

leetcode之排序和搜索

作者: HugiFish | 来源:发表于2019-06-20 19:30 被阅读0次

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;
    }

相关文章

网友评论

      本文标题:leetcode之排序和搜索

      本文链接:https://www.haomeiwen.com/subject/icojqctx.html