给定两个数组 A 和 B,每个数组包含 n 个整数。您需要从 A 中精确选择一个数字,从 B 中精确选择一个数字,使得所选的两个数字的索引不相同,并且所选的 2 个值的总和最小。
您的目标是找到并打印这个最小值。
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
static int twinArrays(int[] ar1, int[] ar2){
// Complete this function
int minAr1 = ar1[0];
int minAr2;
int index = 0;
for(int i =0; i<ar1.length;i++) {
if(ar1[i]<minAr1) {
minAr1 = ar1[i];
index = i;
}
}
if(index == 0) {
minAr2 = ar2[1];
}else {
minAr2 =ar2[0];
}
for(int j=0;j<ar2.length;j++) {
if(j!=index && minAr2>ar2[j]) {
minAr2 =ar2[j];
}
}
return minAr1+minAr2;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if(n>=2 && n<=1000000) {
int[] ar1 = new int[n];
for(int ar1_i = 0; ar1_i < n; ar1_i++){
int temp1 = in.nextInt();
if(temp1>=1&&temp1<=1000000) {
ar1[ar1_i] = temp1;
}
}
int[] ar2 = new int[n];
for(int ar2_i = 0; ar2_i < n; ar2_i++){
int temp2 = in.nextInt();
if(temp2>=1&&temp2<=1000000) {
ar2[ar2_i] = temp2;
}
}
int result = twinArrays(ar1, ar2);
System.out.println(result);
}
}
}
我已经实现了,工作正常,但仍然缺少一些东西,所以一些测试用例失败,如果您发现此代码中的任何缺陷,任何人都可以给我一些线索和提示来优化我的代码
最佳答案
您的代码的工作原理是从第一个数组中查找最小值,然后从第二个数组中查找与第一个数组中的最小值不在同一位置的最小值。这种方法的问题在于它不能保证找到总体最小总和。例如,考虑这些小数组:
[0, 1], [0, 100]
在这里,如果取第一个数组的最小值 (0) 和不在同一位置的第二个数组的最小值 (100),则得到的总和为 100。但是,正确的总和为pick 是第二个数组中的最小值 (0) 和第一个数组中的第二小值 (1),总共 1。
这里有用的一个观察是最小和对必须是以下之一:
- 每个数组中最小值的总和。
- 一个数组中的最小值与另一个数组中的第二小值之和。
您的解决方案在这里是正确的,只是您不考虑从第二个数组中取出最小的值以及从第一个数组中取出第二小的值。尝试编辑您的代码以解决这种情况。
关于java - 双数组从每个数组索引中查找最小值必须不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44503854/