我有一个代码的作业,它在一个数组中搜索四个数字,其总和等于k(在这个例子中,k = 10)。可以多次使用相同的数组元素。换句话说,它将数组的四个元素相加,将总和与值k进行比较,如果它们相等则返回true,否则返回其他元素。到目前为止,代码总结了数组的四个不同元素,但我需要对其进行更改,以便当任何单个元素在四个元素的总和中多次使用时也可以工作,例如,如果array [2] * 4 == k或array [0] * 2 + array [1] * 2 == k,返回true。
代码中的“static int [] [] esim”是示例输入。例如,{1,2,3,4}返回true,因为当k = 10时,1 + 2 + 3 + 4 == k。{4,3,1,5,5,6,6}在为真时返回false是预期的,因为代码没有考虑重复的元素,因此忽略了2 * 4 + 2 * 1 == k。类似地,当预期为真时,{2,3}返回false,尽管2 * 2 + 2 * 3 == k。
任何人都可以给我一个如何实现我想要的提示吗?
import java.util.Arrays;
public class Etsinta2 {
public static boolean etsi(int[] tl, int k) {
Arrays.sort(tl);
for (int i = 0; i < tl.length; i++) {
int b = i + 1;
int c = i + 2;
int d = tl.length - 1;
while (b < d) {
if (tl[i] + tl[b] + tl[c] + tl[d] == k) {
return true;
} else if (tl[i] + tl[b] + tl[c] + tl[d] < k) {
b++;
c++;
} else {
d--;
}
}
}
return false;
}
static int[][] esim = new int[][]{{5},
{2, 3},
{1, 1, 1, 1},
{1, 2, 3, 4},
{4, 2, 3, 1},
{4, 6, 5, 5},
{6, 4, 5, 5},
{6, 6, 6, 4},
{4, 4, 1, 1, 1, 6, 6},
{9, 1, 1, 1, 1, 5, 6},
{4, 3, 1, 5, 5, 6, 6}};
public static void main(String[] args) {
for (int[] taulu : esim) {
System.out.println(Arrays.toString(taulu) + " 10 : " + etsi(taulu, 10));
}
}
}
答案 0 :(得分:0)
你在检查元素的总和是否是k的倍数?如果是这样,你可以加总所有元素并检查%(mod)k是否为零(即除以k后没有余数)。
编辑:好的我再次阅读了这个问题,我认为问题是从数组中找到4个数字(并且重复数字是可以的)总和为k。
(抱歉,我试图删除这个答案,但不能轻易)
所以这里有解决方案:有四个嵌套循环,每个“数字槽”一个。让每个循环从阵列中一次选择一个数字(因此允许重复选择)。检查最内层循环中的总和。如果是k,请打破true
。如果最后不成立,false
。
答案 1 :(得分:0)
好的,我找到了一个不同的解决方案,它应该将时间复杂度带到O(n ^ 2 log n)。这使用辅助列表,其存储所有可能的数组元素对的总和,然后将这些和的对的总和与k进行比较。这是我使用过ArrayList的编辑方法。它运行良好,除了它仍然太慢:通过机器人测试仪提交作业,显然用大数字测试的隐藏测试,时钟为27.0毫秒,而所需的最大值为25.0毫秒。有什么方法可以通过一些小的改动来加快代码的速度吗?
public static boolean etsi(int[] tl, int k) {
ArrayList<Integer> summat = new ArrayList<Integer>()
Arrays.sort(tl);
for (int i = 0; i < tl.length; i++) {
for (int j = 0; j < tl.length; j++) {
summat.add(tl[i] + tl[j]);
}
}
int a = 0;
int b = summat.size() - 1;
for (int i = 0; i < summat.size(); i++) {
if (summat.get(a) + summat.get(b) == k) {
return true;
} else if (summat.get(a) + summat.get(b) < k) {
a++;
} else {
b--;
}
}
return false;
}