二维数组合并成一个数组_合并两个有序数组

需求

有两个有序数组a[] 和 b[],将它们合并成数组c[],要求数组c[]也是有序数组。
例如,数组a[] = {4, 6}; 数组b[] = {1, 2, 3, 5}; 那么合并后的数组c[] = {1, 2, 3, 4, 5, 6}。

实现过程

1、定义数组c[] 长度为数组a[] 的长度与数组b[] 长度之和;
2、定义三个变量i, j, k 分别指向数组a[]、数组b[] 和 数组c[] 的起始下标;
3、遍历数组a[] 和 数组b[] ,比较a[i] 和 b[j] 大小,将较小的一个值放入c[k] 位置,直到其中一个数组遍历完;
4、将未遍历完的数组的剩余元素依次放入数组c[] 中。

d41193670bc214c10abb3c3dad884ddc.png

完整代码

 1public class MergeArray {
2
3    public int[] merge(int[] a, int[] b) {
4        int lenA = a.length;
5        int lenB = b.length;
6
7        // 定义一个数组c[] 用于存储合并结果,长度为数组a的长度 + 数组b的长度
8        int[] c = new int[lenA + lenB];
9        int i = 0; // 指向数组a[]的起始下标
10        int j = 0; // 指向数组b[]的起始下标
11        int k = 0; // 指向数组c[]的起始下标
12
13        // 遍历数组a[] 和 数组b[] 比较元素大小,并将比较结果放入数组c[] 中
14        while (i 15            if(a[i] <= b[j]) {
16                c[k++] = a[i++];
17            }else {
18                c[k++] = b[j++];
19            }
20        }
21
22        // 数组a[] 有剩余
23        while (i 24            c[k++] = a[i++];
25        }
26        // 数组b[] 有剩余
27        while (j 28            c[k++] = b[j++];
29        }
30
31        return c;
32    }
33
34}
END e1672ad1a4de3ba85d18c4765f0c1bda.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用[1],这是一个将二维数组中值为0的行和列都置为0的问题。可以使用两个一维数组来记录每行和每列是否有0,然后再遍历一次数组,将对应行和列的值都置为0。具体实现可以参考以下代码: ```c void setZeroes(int** matrix, int matrixSize, int* matrixColSize) { int m = matrixSize; int n = matrixColSize[0]; int row[m], col[n]; memset(row, 0, sizeof(row)); memset(col, 0, sizeof(col)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (!matrix[i][j]) { row[i] = col[j] = true; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (row[i] || col[j]) { matrix[i][j] = 0; } } } } ``` 根据提供的引用,这是一个在有序数组中查找目标值的问题。可以使用二分查找的方法来实现。具体实现可以参考以下代码: ```c int searchInsert(int* nums, int numsSize, int target){ int mid ,left=0, right=numsSize-1; mid=numsSize/2; while(left<=right){ if(target>nums[mid]) left=mid+1; else if(target<nums[mid]) right=mid-1; else return mid; mid=(left+right)/2; } return left; } ``` 至于二维数组区间合并,需要先将二维数组按照区间左端点排序,然后遍历一次数组,将重叠的区间合并。具体实现可以参考以下代码: ```c int cmp(const void* a, const void* b) { int* pa = *(int**)a; int* pb = *(int**)b; return pa[0] - pb[0]; } int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){ if (intervalsSize == 0) { *returnSize = 0; return NULL; } qsort(intervals, intervalsSize, sizeof(int*), cmp); int** res = (int**)malloc(sizeof(int*) * intervalsSize); int idx = -1; for (int i = 0; i < intervalsSize; i++) { if (idx == -1 || intervals[i][0] > res[idx][1]) { res[++idx] = intervals[i]; } else { res[idx][1] = fmax(res[idx][1], intervals[i][1]); } } *returnSize = idx + 1; *returnColumnSizes = (int*)malloc(sizeof(int) * (*returnSize)); for (int i = 0; i < *returnSize; i++) { (*returnColumnSizes)[i] = 2; } return res; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值