https://leetcode.com/problems/merge-sorted-array/?envType=study-plan-v2&envId=top-interview-150
오름차순으로 정렬된 1-indexed 배열
numbers
, 그리고 목표값target
이 주어졌을때 배열의 특정 두 값이 목표값이 되는 경우를 찾으세요. 단, 선택한 수는 같은 요소를 두번 사용해서는 안됩니다.
class Solution {
public int[] twoSum(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) {
return new int[]{left + 1, right + 1};
} else if (sum < target) {
left++;
} else {
right--;
}
}
return new int[]{-1, -1};
}
}
Runtime 1ms
O(m + n)의 시간 복잡도를 가진 알고리즘으로 설계 할 수 있나요?
1
의 System.arraycopy(nums2, 0, nums1, m, n)의
시간 복잡도는 O(n)
인데 2
의 Arrays.sort(nums1)
의 시간복잡도는 O(m * log m)
의 복잡도를 가집니다. 즉 총합 시간 복잡도는 O(n + m * log m)
입니다.
O(m * log m)
의 Arrays.sort(nums1)
를 사용하지 않고 해결한다면 더 빠르게 수행할 수 있을거 같습니다. 이를 위해서 1의 System.arraycopy
가 아닌 전체적으로 새로운 풀이의 필요성이 느껴졌습니다. 1
,2
2개의 과정으로 나누는 것이 아니라 하나의 동작으로 하려면 어떻게 해야하는지 고민해 보았습니다. 그 결과 정렬되어있는 두개의 정렬을 값을 비교하면서 알맞은 위치에 넣어준다는 하나의 동작으로 하면 어떨까라는 발상이 떠올랐습니다.nums1
의 배열 끝부분에는 nums2
가 들어가기 위해 0의 값으로 입력되어 있다는 제약조건이 떠올랐습니다. 그렇다면 끝 값부터 정리해나가면 될거 같아서 이를 통해 새로운 풀이를 작성해 보았습니다.pt1
,pt2
에 각 배열의 마지막 인덱스를 주입pt1
에 해당하는 값이 더 크거나 같다면 해당 값을 nums1의 마지막 값 즉 pt1 + pt2 + 1
의 인덱스값에 넣기 그리고 pt1 감소pt2
에 해당하는 값이 더 큰 경우에는 해당 값을 nums1의 마지막 값 즉 pt1 + pt2 + 1
의 인덱스값에 넣기 그리고 pt2 감소class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
pt1 = m;
pt2 = n;
while (ptr1 >= 0 && ptr2 >= 0) {
if (nums2[ptr2] > nums1[ptr1]) {
nums1[ptr1 + ptr2 + 1] = nums2[ptr2];
ptr2--;
} else {
nums1[ptr1 + ptr2 + 1] = nums1[ptr1];
ptr1--;
}
}
while (ptr2 >= 0) {
nums1[ptr1 + ptr2 + 1] = nums2[ptr2];
ptr2--;
}
}
}
Runtime 0ms