【Leetcode -278.第一个错误的版本 -283.移动零】

简介: 【Leetcode -278.第一个错误的版本 -283.移动零】

Leetcode -278.第一个错误的版本

题目:你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本[1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例 1:

输入:n = 5, bad = 4

输出:4

解释:

调用 isBadVersion(3) -> false

调用 isBadVersion(5) -> true

调用 isBadVersion(4) -> true

所以,4 是第一个错误的版本。

示例 2:

输入:n = 1, bad = 1

输出:1

提示:

1 <= bad <= n <= 2^31 - 1

我们的思路是,因为要尽量减少对调用 API 的次数,而且1-n已经是有序的,所以我们运用二分查找法调用API,每次找出区间的中间数mid就调用一次API,若返回false,将mid+1更新为左边界;若返回true,也不一定是最小错误的版本,将mid更新为右边界,这里是个循环,循环条件为右边界小于左边界,到最后右边界和左边界会重合,这个数就是最小的错误的版本;

// The API isBadVersion is defined for you.
    // bool isBadVersion(int version);
    int firstBadVersion(int n)
    {
        //因为n是从1到2^31 - 1
        //所以定义左边界为1,右边界为n
        int left = 1, right = n;
        //当右边界比左边界小,循环继续
        while (left < right)
        {
            //找出中间数
            int mid = left + (right - left) / 2;
            //调用接口函数,判断是否是错误的版本
            //若返回true,则是错误的版本,但不一定是最小的错误的版本,所以用这个中间数更新right
            //若返回false,则这个中间数不是错误的版本,所以将这个中间数+1更新给left
            if (isBadVersion(mid))
                right = mid;
            else
                left = mid + 1;
        }
        //最后left会和right重合,即是最小的错误的版本
        return right;
    }

Leetcode -283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0, 1, 0, 3, 12]

输出 : [1, 3, 12, 0, 0]

示例 2 :

输入 : nums = [0]

输出 : [0]

提示 :

1 <= nums.length <= 104

  • 2^31 <= nums[i] <= 2^31 - 1

我们的思路是双指针,当慢指针遇到0时不动,快指针继续走,直到快指针遇到不是0的数,就与慢指针的元素交换,交换完两个指针都往后走;

void moveZeroes(int* nums, int numsSize)
    {
        //定义两个指针,下标均从0开始
        int slow = 0, fast = 0;
        //当快的指针比数组长度小,循环继续
        while (fast < numsSize)
        {
            //当快指针下标对应的元素不为0,与慢指针的值交换,交换完都++
            if (nums[fast])
            {
                int tmp = nums[fast];
                nums[fast] = nums[slow];
                nums[slow] = tmp;
                fast++;
                slow++;
            }
            //否则,当遇到0,慢指针不动,快指针继续走
            else
            {
                fast++;
            }
        }
    }
目录
相关文章
|
3月前
|
算法 测试技术 API
【Leetcode刷题Python】278. 第一个错误的版本
本文提供了使用二分查找算法解决LeetCode "第一个错误的版本" 问题的Python实现,通过递归地缩小搜索范围来查找导致之后所有版本出错的第一个错误版本。
19 0
|
6月前
|
测试技术 API
【力扣】278. 第一个错误的版本
【力扣】278. 第一个错误的版本
|
6月前
|
测试技术 API C++
leetcode-278:第一个错误的版本
leetcode-278:第一个错误的版本
28 1
|
6月前
|
Go
golang力扣leetcode 278.第一个错误的版本
golang力扣leetcode 278.第一个错误的版本
32 0
|
6月前
|
存储 算法 vr&ar
☆打卡算法☆LeetCode 165. 比较版本号 算法解析
☆打卡算法☆LeetCode 165. 比较版本号 算法解析
|
12月前
|
存储
leetcode 165. 比较版本号
leetcode 165. 比较版本号
50 0
|
Python
LeetCode 278. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
107 0
|
存储
LeetCode 165. 比较版本号
给你两个版本号 version1 和 version2 ,请你比较它们。
83 0
|
前端开发 算法 JavaScript
LeetCode第一个错误版本使用JavaScript解题|前端学算法
LeetCode第一个错误版本使用JavaScript解题|前端学算法
90 0
LeetCode第一个错误版本使用JavaScript解题|前端学算法
|
测试技术 API 索引
【day10】LeetCode(力扣)刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]
刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]。
130 0
【day10】LeetCode(力扣)刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]