LeetCode노트-77그룹

2305 단어 LeetCode 노트
제목:
두 개의 정수 n과 k를 주고 1을 되돌려줍니다.n의 모든 가능한 k 개의 조합.
예:
 : n = 4, k = 2
 :
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

사고방식: 다음은 인터넷 대신의 코드, 원문 링크를 참고했다.https://blog.csdn.net/happyaaaaaaaaaaa/article/details/51564160
점차적으로 실현되는 문제로 깊이 있게 우선적으로 검색한다는 뜻이 있다.귀환의 반환 조건은 k==0입니다. 즉, 길이가 K인 조합을 찾아 결과 집합에 추가하고temp에서 삭제합니다.
코드:
class Solution {     public List> combine(int n, int k) {      List> res = new ArrayList>();         List temp = new ArrayList();         dfs(res, temp, n, k, 1);         return res; } private void dfs(List>res, List temp, int n, int k, int m) {if(k==0) {//귀속 종료 조건res.add(new ArrayList(temp);return;} for(int i=m;i<=n;i++) {temp.add(i);/첫 번째 요소를temp dfs(res,temp,n,k-1,i+1)에 추가합니다;//귀속 호출, i+1부터temp.remove(temp.size()-1)-1을 반복하지 않기;/원래 저장된 조합을 꺼내서 다시 시작합니다}
    } }
아래의 두 가지 사고방식은 일치하지만 판단 조건을 하나 더 추가했을 뿐이다.
가장 많은 코드를 제출합니다.
class Solution {
    public List> combine(int n, int k) {
        List> res = new ArrayList>();
        if(k>n) return res;
        List list = new ArrayList();
        getPass(n, k, list, res, 1);
        return res;
    }
    
    public void getPass(int n, int k, List list, List> res, int start){
        if(list.size() == k){
            res.add(new ArrayList(list));
            return;
        }
        int len = list.size();
        for(int i=start;i<=n;i++){
            if(n-i

가장 빠른 코드 실행:
class Solution {
    public List> combine(int n, int k) {
        List> res = new ArrayList>();
        if(k>n) return res;
        List list = new ArrayList();
        getPass(n, k, list, res, 1);
        return res;
    }
    
    public void getPass(int n, int k, List list, List> res, int start){
        if(list.size() == k){
            res.add(new ArrayList(list));
            return;
        }
        int len = list.size();
        for(int i=start;i<=n;i++){
            if(n-i

좋은 웹페이지 즐겨찾기