java数组中4个元素的总和等于k个重复数组元素

java数组中4个元素的总和等于k个重复数组元素,java,arrays,sum,Java,Arrays,Sum,我有一个代码的家庭作业,它在一个数组中搜索四个和等于k的数字(在这个例子中,k=10)。同一数组元素可以多次使用。换句话说,它对数组的四个元素求和,将和与值k进行比较,如果它们相等,则返回true,如果不相等,则返回其他元素。到目前为止,代码对数组的四个不同元素求和,但我需要对其进行修改,以便在四个元素的和中多次使用任何单个元素时,它也能工作,例如,如果数组[2]*4==k或数组[0]*2+array[1]*2==k,则返回true 代码中的“static int[][]esim”是示例输入。例

我有一个代码的家庭作业,它在一个数组中搜索四个和等于k的数字(在这个例子中,k=10)。同一数组元素可以多次使用。换句话说,它对数组的四个元素求和,将和与值k进行比较,如果它们相等,则返回true,如果不相等,则返回其他元素。到目前为止,代码对数组的四个不同元素求和,但我需要对其进行修改,以便在四个元素的和中多次使用任何单个元素时,它也能工作,例如,如果数组[2]*4==k或数组[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}在预期为true时返回false,因为代码不考虑重复的元素,因此忽略2*4+2*1==k。类似地,{2,3}在预期为true时返回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));
       }
   }
}
导入java.util.array;
公共类Etsinta2{
公共静态布尔etsi(int[]tl,int k){
数组。排序(tl);
for(int i=0;i
是否检查元素的总和是否为k的倍数?如果是这样,您可以将所有元素求和并检查%(mod)k是否为零(即除以k后没有余数)

编辑:好的,我再次阅读了这个问题,我认为问题是从数组中找到4个数字(可以复制这些数字)求和到k

(抱歉,我试图删除此答案,但无法轻松删除)


因此,这里有一个解决方案:有四个嵌套循环,每个“数字槽”对应一个。让每个循环一次从数组中选取一个数字(因此允许重复选择)。检查最内部循环中的总和。如果是k,则断开w/
true
。如果最后不为true,
false
好的,我找到了一个不同的解决方案,它会将时间复杂度提高到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;
 }
公共静态布尔etsi(int[]tl,int k){ ArrayList summat=新的ArrayList() 数组。排序(tl); for(int i=0;i您需要澄清您想要实现的目标。很抱歉,我编辑了我的说明,以便更清楚地了解这一点。请给出示例输入和(正确)输出。我的说明会相应地重新编辑。是的,这是一个粗糙但有效的解决方案。不幸的是,这四个循环构成了O(n⁴), 而作业显然要求O(n²logn)解决方案。@MariaNiku LOL我正要编辑它,说它效率太低了……n^2 log n是包含排序还是假定一个排序数组?是的,它包含排序-虽然在我的代码中,它似乎对最终结果没有影响。对不起,我有点阻塞。我能想到的唯一一件事是ATM I这是一个“骗局”,你完全在k空间中工作,分解结果(10)所有可能的数组-答案组合。这也和任何东西一样慢,也和所有东西一样大,但技术上它不在n-空间中,所以最后,当你得到一个输入数组时,你只需在n^2 log n时间内查找答案……啊,实际上,忽略它。找到了必要的小更改,并且能够通过ho我的工作。非常感谢你的建议,塞卡,以及其他指示我更具体的人。谢谢你自己完成它!