Все числа в одном массиве <= в другой массив - PullRequest
0 голосов
/ 10 сентября 2011

Я ищу создание в Java функции, которая будет принимать два массива или списка и сможет определить, подходит ли первый массив (источник) ко второму (цель). Целевой массив имеет значения, которые нельзя превысить в исходном массиве.

Например:

[ 16, 16, 16 ] will not fit into [ 13, 13, 22 ]

[ 12, 12 ]     will fit into [ 16, 16, 12 ]

[ 12, 18, 14 ] will not fit into [ 10, 18, 14 ]

[ 12, 24 ]     will fit into [ 10, 12, 24 ]

[ 10, 10, 10 ] will not fit into [ 10, 10 ]

Моя текущая попытка (IANA CS Major!) Подходит для трехэлементных массивов, и это все, что мне нужно беспокоиться в краткосрочной перспективе, но мне не хватает некоторой логики во внутреннем цикле, которая предотвратит ложные отрицания.

Суть: https://gist.github.com/1208514

private Boolean designFits(int[] max, int[] design) {

    Boolean designFits = true;

    Arrays.sort(max);
    Arrays.sort(design);
    int passCount = 0;

    if(design.length <= max.length) {

        for(int i = 0; i < max.length; i++) {

            for(int j = 0; j < design.length; j++) {

                if(max[i] <= design[j]) {

                    passCount++;

                }

            }

        }

        if(passCount == 0 || passCount > max.length) {
            designFits = false;

        }


    } else {
        designFits = false;

    }

    return designFits;

}

Ответы [ 5 ]

2 голосов
/ 10 сентября 2011

Я думаю, что это достигает того, что вы ищете:

private static boolean designFits(int[] source, int[] target) {

    //if source is bigger than target, it cannot fit
    if (source.length > target.length) {
       return false;
    }

    //sort the arrays
    Arrays.sort(source);
    Arrays.sort(target);

    //get the size difference between target and source
    int targetSizeDiff = target.length - source.length;

    //walk source:
    for (int i = 0; i < source.length; i++) {
       //compare source's value at index i with target's value at i + difference
       //if it's greater, source cannot fit
       if (source[i] > target[i + targetSizeDiff]) {
          return false;
       }
    }

    //at this point we know source can fit
    return true;
}

public static void main(String[] args) {

    //false
    System.out.println(designFits(new int[]{16, 16, 16}, new int[]{13, 13, 22}));

    //true
    System.out.println(designFits(new int[]{12, 12}, new int[]{16, 16, 12}));

    //false
    System.out.println(designFits(new int[]{12, 18, 14}, new int[]{10, 18, 14}));

    //true
    System.out.println(designFits(new int[]{12, 24}, new int[]{10, 12, 24}));

    //false
    System.out.println(designFits(new int[]{10, 10, 10}, new int[]{10, 10}));
}
2 голосов
/ 10 сентября 2011

Сортируйте два массива, затем просмотрите исходный массив и попробуйте вписать каждый элемент в целевой массив. Если элемент не подходит, попробуйте следующее место в цели. Если у вас закончились места, которые ему не подходят, если вы успешно найдете место для всех элементов, которые ему подходят.

0 голосов
/ 10 сентября 2011

Вы можете отсортировать оба массива в в порядке убывания и сравнить каждую пару, если сравнение не удастся для любой пары, которую вы можете вернуть false.

private Boolean designFits(int[] max, int[] design) {
    if (max.length > design.length) return false;

    Arrays.sort(max, Collections.reverseOrder());
    Arrays.sort(design, Collections.reverseOrder());

    for (int i = 0; i < max.length; i++)
        if (max[i] > design[i]) return false;

    return true;
}
0 голосов
/ 10 сентября 2011

Кажется, проблема, которую вы хотите решить, выглядит следующим образом:

return first.length <= last.length && max(first) <= min(second) 

, где "min" и "max" - это функции, которые возвращают элемент min и max массива.Если я правильно понимаю, должно быть легко кодировать min и max.

0 голосов
/ 10 сентября 2011

С коллекциями вы можете использовать метод containsAll следующим образом:

List<Integer> list1 = new ArrayList();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);
list1.add(6);

List<Integer> list2 = new ArrayList();
list2.add(1);
list2.add(2);
list2.add(3);

System.out.println(list1.containsAll(list2));
...