88.合并两个有序数组
非递减顺序,即非严格递增序列
自己没写出来
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int tail1 = m-1;
int tail2 = n-1;
int tail = nums1.length - 1;
while(tail1 >= 0 && tail2 >= 0){ // 区别在这里
if(nums1[tail1] >= nums2[tail2]){
nums1[tail] = nums1[tail1];
tail1 --;
}else{
nums1[tail] = nums2[tail2];
tail2 --;
}
tail --;
}
}
}
修改
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int tail1 = m-1;
int tail2 = n-1;
int tail = nums1.length - 1;
while(tail2 >= 0){ // 区别在这里
if(tail1 >= 0 && nums1[tail1] >= nums2[tail2]){ // 区别在这里
nums1[tail] = nums1[tail1];
tail1 --;
}else{
nums1[tail] = nums2[tail2];
tail2 --;
}
tail --;
}
}
}
要后判断,防止nums1数组的有效元素为0个的情况出现,错误示例
吴师兄的
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 索引从有序数组 nums1 有效元素的末端开始
// 数组的下标索引从零开始计数
// 索引 0 1 2
// 数组 [ 1 , 2 , 3 ]
int i = m - 1;
// 索引从有序数组 nums2 的末端开始
int j = n - 1;
// 从有序数组 nums1 最末端的位置开始保存元素
int cur = nums1.length - 1;
// 通过循环把 num2 的元素都移动到 num1 中
while( j >= 0 ){
// 比较 num1 和 num2 中当前的元素大小
// 如果 num1 中的索引位置为 i 的元素大于 num2 中索引位置为 j 的元素
// 为了防止越界 i 必须是大于等于 0
if( i >=0 && nums1[i] > nums2[j] ){
// 把 num1 中的索引位置为 i 的元素复制到索引为 cur 的位置
// 此时 cur 的元素已经确定下来
nums1[cur] = nums1[i];
// 接下来去确定 cur 前面一个元素应该放什么数字
cur--;
// 此时,索引 i 需要向前移动
i--;
// 否则,如果 num1 中的索引位置为 i 的元素小于或者等于 num2 中索引位置为 j 的元素
}else{
// 把 num2 中的索引位置为 j 的元素复制到索引为 cur 的位置
nums1[cur] = nums2[j];
// 接下来去确定 cur 前面一个元素应该放什么数字
cur--;
// 此时,索引 j 需要向前移动
j--;
}
}
}
}
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1;
int j = n - 1;
int cur = nums1.length - 1;
while( j >= 0 ){
if( i >=0 && nums1[i] > nums2[j] ){
nums1[cur] = nums1[i];
cur--;
i--;
}else{
nums1[cur] = nums2[j];
cur--;
j--;
}
}
}
}