其他分享
首页 > 其他分享> > 剑指offer-合并两个排序的数组

剑指offer-合并两个排序的数组

作者:互联网

题目要求

已知两个已经排好序的数组A1,A2,将两个排序的数组合并到一起,并使之合并的数组也是排序的数组。
例如已知两个排序的数组是 {1,2,3,4},{2,4,5,6},那么合并后的排序的数组是{1,2,2,3,4,4,5,6}

思路

1.如果遍历两个数组的话,从前遍历两个数组,判断两个数组中的大小,从而合并成一个大的排好序的数组的话,这种解决方案,会出现多次复制一个数字的情况,更好的额解决方案,是从尾比较A1和A2中的数字,并把较大的数字复制到A1中的位置。

2.解决方案考虑了多种情况:

代码实现

package com.offer.test;

/**  
 * 
 * 样例  1:
	输入: A=[1], B=[1]
	输出:[1,1]
	
	样例解释: 
	返回合并后的数组。

样例 2:
	输入: A=[1,2,3,4], B=[2,4,5,6]
	输出: [1,2,2,3,4,4,5,6]
	
	样例解释: 
	返回合并后的数组。
 * @author zhouwenchen@021.com  
 * @date 2019年6月13日 上午9:44:09 
 */
public class SortArr {
	public static void sortArr(int[] A, int[] B) {
		// 将数组A拷贝到数组C中,数组C的长度是等于A.length+B.length
		int[] C = new int[A.length + B.length];

		// 1.解决问题1.可能某一个数组的最大值小于另个数组的最小值
		int a = A.length - 1;
		int b = B.length - 1;
		/**
		 * 可能某一个数组为空
		 */
		if (A.length == 0) {
			System.arraycopy(B, 0, C, 0, b + 1);
			return;
		}
		if (B.length == 0) {
			System.arraycopy(A, 0, C, 0, a + 1);
			return;
		}
		// A中的最大值小于B中的最小值,直接复制到数组C中
		if (A[a] < B[0]) {
			System.arraycopy(A, 0, C, 0, a + 1);
			System.arraycopy(B, 0, C, a + 1, b + 1);
			return;
		}
		// B中最大值小于A中的最小值,直接复制到数组C中
		if (B[b] < A[0]) {
			System.arraycopy(B, 0, C, 0, b + 1);
			System.arraycopy(A, 0, C, b + 1, a + 1);
			return;
		}
		// 从数组的高位置开始判断
		for (int i = C.length - 1; i >= 0; i--) {
			// A数组已经判断完了,直接将剩下的B数组复制到C中
			if (a < 0) {
				System.arraycopy(B, 0, C, 0, b + 1);
				continue;
			}
			// B数组已经判断完了,直接将剩下的A数组复制到C中
			if (b < 0) {
				System.arraycopy(A, 0, C, 0, a + 1);
				continue;
			}
			if (A[a] >= B[b]) {
				C[i] = A[a];
				a--;
			} else {
				C[i] = B[b];
				b--;
			}
		}
		System.out.println(C.toString());
	}
	
	
	/**
	 * 问题1,可能某一个数组的最大值小于两个数组的最小值。
	 * @param args
	 */
	public static void main(String[] args) {
		// 测试案例1:
//		int[] A = new int[] { 1, 2, 3, 4};
//		int[] B = new int[] { 2, 4, 5, 6 };
		
		// 测试案例2
//		int[] A = new int[] { 1, 2, 3, 4};
//		int[] B = new int[] { 5, 6, 7, 8 };
		
		// 测试案例3
		int[] A = new int[] { };
		int[] B = new int[] { 5, 6, 7, 8 };
		sortArr(A, B);
	}
}

标签:offer,int,System,length,数组,new,排序,arraycopy
来源: https://blog.csdn.net/qq_20667511/article/details/97259539