Find the largest subset of the set of numbers, such that the sum of any two numbers is not divisible by a given number

I am trying to solve the Hackerrank Indivisible Subset problem listed below:

enter image description here

I tried to execute the following solution (which works for a test case):

# The lines below are for Hackerrank submissions
# n, k = map(int, raw_input().strip().split(' '))
    # a = map(int, raw_input().strip().split(' '))

n = 4
k = 3
a = [1, 7, 2, 4]

while True:
    all_pairs = [(a[i],a[j]) for i in range(len(a)) for j in range(i+1,len(a))]
    tested_pairs = {pair: (pair[0] + pair[1]) % k != 0 for pair in all_pairs}
    disqualified_pairs = {key: value for key, value in tested_pairs.iteritems() if not value}.keys()
    if not disqualified_pairs:
        break
    occurrences = list(sum(disqualified_pairs, ()))
    counts = map(lambda x: occurrences.count(x), a)
    index_remove = counts.index(max(counts))
    a.remove(index_remove)

print len(a)

What I'm trying to do is identify the “offensive” pairs and remove the element athat occurs most often until there are no “offensive” pairs left.

However, for most test cases, I get a "RunTime Error":

enter image description here

, , ( 2), . - , ?

UPDATE

k = 2 a = [1, 2, 3], :

n = 4
k = 2
a = [1, 2, 3]

while True:
    all_pairs = [(a[i],a[j]) for i in range(len(a)) for j in range(i+1,len(a))]
    disqualified_pairs = [pair for pair in all_pairs if (pair[0] + pair[1]) % k == 0]
    if not disqualified_pairs:
        break
    offending_numbers = sum(disqualified_pairs, ())   # 'Flatten' the disqualified pairs into a single list
    counts = {el: offending_numbers.count(el) for el in set(offending_numbers)}     # Count occurrences of each offending number
    number_to_remove = max(counts, key=counts.__getitem__)
    a.remove(number_to_remove)

print len(a)

a [2, 3] , . , - . , " " :

enter image description here

https://www.hackerrank.com/challenges/pairs/forum/comments/9154, - ( , ..), , . ?

+4
2

.

: O (n + k)

: O (k) O (1), k 100 , O (k) = > O (1)


(a + b)% k = ((a% k) + (b% k))% k

(a% k) [0, k-1],

(a% k) + (b% k) [0, 2k-2]

,

(a + b)% k = 0,

  • (a% k) = 0 (b% k) = 0

  • (a% k) + (b% k) = k

  • 2, i, , k-i.
  • , i.
  • 1 1 0
  • k , k/2 + k/2 = k. 1 k/2, k

,

  • n < 2, n
  • k 0, Arr,
  • a 0 n-1, 1 Arr [a [i]% k]
  • 0
  • Arr 1 k- (k/2) -1, Max (Arr [i], Arr [k-i]),
  • Arr [0] > 0, 1
  • k% 2 = 0 Arr [k/2] > 0, 1
+2

:

1. find power set of given list of integers.
2. sort power set by subset size.
3. iterate down the sorted power set and print if subset meets problem conditions.

java:

import java.util.*;
public class f implements Comparator<List<?>> {

    @Override
    public int compare(List<?> o1, List<?> o2) {
        return Integer.valueOf(o1.size()).compareTo(o2.size());
    }
    static ArrayList<ArrayList<Integer>> powerSet = new ArrayList<>();

    // get power set of arr
    static void g(int arr[],int[] numbers,int i){
        if(i==arr.length){
            ArrayList<Integer> tmp = new ArrayList<>();
            for(int j = 0;j<arr.length;j++){
                if(arr[j]==1) tmp.add(numbers[j]);
            }
            powerSet.add(tmp);
            return;
        }
        arr[i] = 1;
        g(arr,numbers,i+1);
        arr[i] = 0;
        g(arr,numbers,i+1);
    }
    static void h(int[] a){
        int[] arr=new int[a.length];
        for(int j =0;j<arr.length;j++){
            arr[j]=0;
        }
        g(arr,a,0);
    }
    // check whether the sum of any numbers in subset are not evenly divisible by k
    static boolean condition(ArrayList<Integer> set,int k){
        for(int i = 0;i<set.size();i++){
            for(int j = i+1;j<set.size();j++){
                if((set.get(i)+set.get(j))%k==0){
                    return false;
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int[] a = new int[n];
        for (int i=0;i<n;i++){
            a[i]=in.nextInt();
        }


        h(a);
        Collections.sort(powerSet, new f());
        for(int i=powerSet.size()-1;i>0;i--){
            if(condition(powerSet.get(i),k)){
                System.out.println(powerSet.get(i).size());
                break;
            }
        }

    }
}

: submit # 9 StackOverflowError:

enter image description here

hackerrank, , , .

+1

Source: https://habr.com/ru/post/1652770/


All Articles