leetcode 3 수의 합 mid

1641 단어 leetcode
제목 링크
우리 가 가장 생각 할 수 있 는 방법 은 n * n * log (n) 이지 만 n * n 의 방법 으로 해결 할 수 있 는 방법 이 있 는 지 알 수 있 습 니 다. 답 은 있 습 니 다.
우선 우 리 는 반드시 List 를 한 번 매 거 해 야 한다. 그러면 O (n) 의 복잡 도가 남 았 다. 우리 가 매 거 진 List, a + b + c = 0 을 생각 할 수 있다.
a + b = -c  매 거 진 - c 라 고 생각 합 니 다. 우 리 는 List 에서 a + b 를 찾 아야 합 니 다. List 의 수의 증가 성 으로 인해 우 리 는 자 에서 a + b 를 꺼 낼 수 있 습 니 다.
다른 왼쪽 점 은 0, 오른쪽 점 은 List. length - 1, List [0] + List [List. length - 1] - c 보다 크 면 오른쪽 점 을 왼쪽으로 기대 게 합 니 다. 이렇게 합 니 다.
a + b 가 줄 어 들 고 반대로 - c 보다 작 으 면 왼쪽 점 은 자 연 스 럽 게 오른쪽으로 이동 합 니 다.
 
class Solution {
	static List> ret = new ArrayList>();
    public static List> threeSum(int[] nums) {
        ret.clear();
        Arrays.sort(nums);
        for(int i = 0; i < nums.length - 2; i++) {
        	int x = nums[i];
        	twoSum(nums, i + 1, -x);
        	while(i < nums.length - 2 && nums[i] == nums[i + 1]) i++;                
        }
        return ret;
    }
    public static void twoSum(int[] nums, int start, int value) {
    	int l = start;
    	int r = nums.length-1;
    	while(l < r) {
    		if(nums[l] + nums[r] == value) {
    			List list = new ArrayList();
    			list.add(nums[start - 1]);
    			list.add(nums[l]);
    			list.add(nums[r]);
                ret.add(list);
    			while(l < r && nums[l + 1] == nums[l]) l++;
    			while(l < r && nums[r - 1] == nums[r]) r--;
    			l++; r--;
    		}
    		else if(nums[l] + nums[r] > value){
    			r--;
    		}
    		else l++;
    	}
    } 
}

좋은 웹페이지 즐겨찾기