当前位置: 代码迷 >> 综合 >> 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
  详细解决方案

有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小

热度:28   发布时间:2024-01-20 03:01:14.0
	public static void main(String[] args) {method(5);}/*** 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小</br>* 思路* 1.算a b 之间的差值 differ</br>* 2. 找出 a b 数组中差值最接近differ/2 的元素</br>* 3. 交换元素</br>* * 在步骤2中,为什么是最接近differ/2 的元素,而不是differ</br>* 因为: d' = sum(a) - a[i] + b[j] - (sum(b) - b[j] = a[i])</br>* 			= sum(a) - sum(b) -2(a[i] - b[j])</br>* 			= differ - 2(a[i] - b[j]) </br>* 要想两数组的差值最小,那么d' 就得最接近0(等于0最好了),那么differ 就与a[i]-b[j]存在2倍的关系。*  *  @param n  数组长度*  */public static void method(int n) {int[] a = new int[n];int[] b = new int[n];// 给数组生成数据 随机的for (int i = 0; i < n; i++) {a[i] = (int) (Math.random() * 10);b[i] = (int) (Math.random() * 10);}System.out.print("数组a: ");for (int i = 0; i < n; i++) {System.out.print(a[i] + "   ");}System.out.println();System.out.print("数组b: ");for (int i = 0; i < n; i++) {System.out.print(b[i] + "   ");}// 求两个数组的差值int differ = 0;for (int i = 0; i < n; i++) {differ += a[i] - b[i];}System.out.println();System.out.println("\n数组a 与数组b 的差值 : " + differ);if (differ == 0) { // 没有差值 两数组相等,结束!System.out.println("数组a 和数组b 相等, 没有差值!");} else { // 在数组a 和b 中找出两个数 让他们的差最接近 difference/2int tmp = 0; // a[i] 与 b[j] 的差值double zjj = 1000; // differ/2 与tmp 的差值int exchangea = -1; // 数组a的下标int exchangeb = -1; // 数组b的下标boolean finish = false; // 如果交换后差值等于difference/2 退出循环for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {tmp = a[i] - b[j];if (tmp == differ / 2) {exchangea = i;exchangeb = j;finish = true;break;} else { // 不相等 找出差值最接近differ/2 的两个数double aa = differ / 2 - tmp;if (Math.abs(aa) < Math.abs(zjj)) {zjj = aa;exchangea = i;exchangeb = j;}}}if (finish) {break;}}if (exchangea != -1 && exchangeb != -1) {System.out.println("交换 a[" + exchangea + "]  " + a[exchangea]+ " 和 b[" + exchangeb + "]  " + b[exchangeb]);}// 交换a[exchangea] = a[exchangea] + b[exchangeb];b[exchangeb] = a[exchangea] - b[exchangeb];a[exchangea] = a[exchangea] - b[exchangeb];// 交换后的差值differ = 0;for (int i = 0; i < n; i++) {differ += a[i] - b[i];}System.out.println("交换后的差值 : " + differ);}


结果 :


  相关解决方案