leetcode题解:排序和搜索


🚝1.合并两个有序数组

在这里插入图片描述
题目解析 双指针,现复制一份nums1数组为num数组,将num和nums2数组较小的数字逐一放入nums1数组中。
代码

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] num=new int[nums1.length];
        System.arraycopy(nums1,0,num,0,nums1.length);
        int a=0;
        int b=0;
        int c=0;
        while(a<m&&b<n){
            nums1[c++]=(num[a]>nums2[b])?nums2[b++]:num[a++];
        }
        if(a<m){
            System.arraycopy(num,a,nums1,c,num.length-nums2.length-a);
        }
        if(b<n){
            System.arraycopy(nums2,b,nums1,c,nums2.length-b);
        }
    }

🚝2.第一个错误的版本

在这里插入图片描述
题目解析 首先观察题目,有时间限制不能全部遍历查找,考虑二分查找,每次判断中间版本是不是正确的,如果是说明第一个错误的版本在中间元素的右边(left=mid+1);如果中间版本是错误的,说明第一个错误的是中间之前的元素或本身(right=mid)。
当某一次操作后,left 和right 的值相等,此时它们就表示了第一个错误版本的位置。

代码

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
       int left=1;
       int right=n;
    while(left<right){
       int mid=left+(right-left)/2;
        if(!isBadVersion(mid)){
            left=mid+1;
        }else{
            right=mid;
        }
    }
        return left;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值