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 的次数。

解题思路:题中要求比较次数最少,那么可以采用二分查找的方法进行比较,二分到最后,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;
    }
上一篇下一篇

猜你喜欢

热点阅读