Skip to content

Commit d4b1213

Browse files
committed
contains-duplicate solution
1 parent b8b7c86 commit d4b1213

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

contains-duplicate/aa601.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
// void printArr(int *arr, int size) {
48+
// int i;
49+
50+
// i = -1;
51+
// while (++i < size)
52+
// printf("%d ", arr[i]);
53+
// }
54+
55+
bool containsDuplicate(int* nums, int numsSize) {
56+
int i;
57+
58+
mergeSort(nums, 0, numsSize - 1);
59+
i = -1;
60+
while (++i + 1 < numsSize) {
61+
if (nums[i] == nums[i + 1])
62+
return (true);
63+
}
64+
return (false);
65+
}
66+
67+
int main()
68+
{
69+
int arr[] = {0, 3, 0};
70+
int size;
71+
72+
size = sizeof(arr) / sizeof(arr[0]);
73+
printf("%d\n", containsDuplicate(arr, size));
74+
}

0 commit comments

Comments
 (0)