Find all subsets of length k in an array

前端 未结 13 1917
梦谈多话
梦谈多话 2020-11-27 05:34

Given a set {1,2,3,4,5...n} of n elements, we need to find all subsets of length k .

For example, if n = 4 and k = 2, the output would be

13条回答
  •  清酒与你
    2020-11-27 05:48

    If you are looking for Iterator pattern answer then here you go.

    public static  Iterable> getList(final Iterable list) {
    
        List> listOfList = new ArrayList<>();
    
        for (T t: list)
            listOfList.add(Collections.singletonList(t));
    
        return listOfList;
    }
    public static  Iterable> getIterable(final Iterable list, final int size) {
    
        final List vals = new ArrayList<>();
        int numElements = 0;
        for (T t : list) {
            vals.add(t);
            numElements++;
        }
    
        if (size == 1) {
            return getList(vals);
        }
        if (size == numElements) {
            return Collections.singletonList(vals);
        }
    
        return new Iterable>() {
    
            @Override
            public Iterator> iterator() {
                return new Iterator>() {
    
                    int currPos = 0;                    
                    Iterator> nextIterator = getIterable(
                        vals.subList(this.currPos + 1, vals.size()), size - 1).iterator();
    
                    @Override
                    public boolean hasNext() {
                        if ((this.currPos < vals.size()-2) && (this.currPos+size < vals.size()))
                            return true;
                        return false;
                    }
    
                    @Override
                    public List next() {
                        if (!nextIterator.hasNext()) {
                            this.currPos++;
                            nextIterator = getIterable(vals.subList(this.currPos+1, vals.size()), size-1).iterator();
                        }
                        final List ret = new ArrayList<>(nextIterator.next());
                        ret.add(0, vals.get(this.currPos));
                        return ret;
                    }
                };
            }
        };
    }
    

提交回复
热议问题