2824. Count Pairs Whose Sum is Less than Target
class Solution {
public int countPairs(List<Integer> nums, int target) {
int count = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.size(); j++) {
if ((i < j) && nums.get(i) + nums.get(j) < target){
count++;
}
}
}
return count;
}
}
📌 Tip
num.size()
를 반복해서 호출하지 말고, 미리int n = num.size()
로 할당해놓으면 성능이 더 좋아짐.
left(l)
, riget(r)
이나 start(s)
, end(d)
와 같은 식으로 포인트의 이름을 붙임start
, end
target
start=end=0
이고, 조건은 항상 두 포인터들의 관계는 start<=end
인 것이다.O(N^2)
가 걸리는 문제를 O(N)
에 해결할 수 있다.import java.util.Arrays;
import java.util.List;
class Solution {
public int countPairs(List<Integer> nums, int target) {
int count = 0;
// List를 배열로 변환
Integer[] numsArray = nums.toArray(new Integer[0]);
// 배열 정렬
Arrays.sort(numsArray);
int left = 0;
int right = numsArray.length - 1;
while (left < right) {
int sum = numsArray[left] + numsArray[right];
// 합이 target보다 작으면, left와 right 사이의 모든 값들이 조건을 만족
if (sum < target) {
count += right - left;
left++; // left 포인터를 오른쪽으로 이동
} else {
right--; // 그렇지 않으면 right 포인터를 왼쪽으로 이동
}
}
return count;
}
}
O(nlogn)
으로 감소