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