Skip to content

Commit df0d71c

Browse files
committed
contains-duplicate
1 parent 6690735 commit df0d71c

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

contains-duplicate/aa601.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include <stdio.h>
2+
#include <stdbool.h>
3+
4+
void merge(int *nums, int left, int mid, int right)
5+
{
6+
int i;
7+
int j;
8+
int k;
9+
int leftArr[mid - left + 1];
10+
int rightArr[right - mid];
11+
12+
i = -1;
13+
while (++i < mid - left + 1) // 왼쪽 분할된 부분 넣기
14+
leftArr[i] = nums[left + i];
15+
i = -1;
16+
while (++i < right - mid) // 오른쪽 분할된 부분 넣기
17+
rightArr[i] = nums[mid + i + 1];
18+
i = 0;
19+
j = 0;
20+
k = left; // **** nums배열인덱스 => left부터 시작
21+
// 나누어진 배열끼리 비교해서 nums배열 재배치
22+
while ((i < mid - left + 1) && (j < right - mid)) {
23+
if (leftArr[i] <= rightArr[j])
24+
nums[k] = leftArr[i++];
25+
else
26+
nums[k] = rightArr[j++];
27+
++k;
28+
}
29+
while (i < mid - left + 1) // left배열 남아있으면 마저 삽입
30+
nums[k++] = leftArr[i++];
31+
while (j < right - mid) // right배열 남아있으면 마저 삽입
32+
nums[k++] = rightArr[j++];
33+
}
34+
35+
void mergeSort(int *nums, int left, int right) {
36+
int mid;
37+
38+
if (left < right)
39+
{
40+
mid = (left + right) / 2;
41+
mergeSort(nums, left, mid); // 왼쪽분할
42+
mergeSort(nums, mid + 1, right); // 오른쪽분할
43+
merge(nums, left, mid, right);
44+
}
45+
}
46+
47+
bool containsDuplicate(int* nums, int numsSize) {
48+
int i;
49+
50+
mergeSort(nums, 0, numsSize - 1);
51+
i = -1;
52+
while (++i + 1 < numsSize) {
53+
if (nums[i] == nums[i + 1])
54+
return (true);
55+
}
56+
return (false);
57+
}
58+
59+
60+

0 commit comments

Comments
 (0)