217. Contains Duplicate
思路:
1:暴力点从开始位置一个个对比,一轮完了,下一个继续。两个for循环搞定,结果这个速度惊人。O(n2)的算法确实很恐怖。
2:排序后,遍历,判断相邻位置是否有相同的。排序这里就用快速排序,稳定。有些生疏了,就重新复习下。
附上算法导论的快速排序思路:
对应这敲了下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int *a, int *b)
{
if(a == b){
return;
}
*a ^= *b;
*b ^= *a;
*a ^= *b;
return;
}
int partition(int *A, int p, int r)
{
int i;
int j;
int x;
x = A[r-1];
i = p-1;
for(j = p; j < r-1; j++){
if(A[j] <= x){
i++;
swap(&A[i], &A[j]);
}
}
swap(&A[i+1], &A[r-1]);
return i + 1;
}
void quick_sort(int *A, int p, int r)
{
int q;
if(p < r){
q = partition(A, p, r);
quick_sort(A, p, q);
quick_sort(A, q+1, r);
}
return;
}
void main(void)
{
int i;
int test[] = {1, 3, 23, 4, 9, 1000, 5, 2};
int r = sizeof(test)/sizeof(test[0]);
for(i = 0; i < r; i++){
printf("%d ", test[i]);
}
printf("\n");
quick_sort(test, 0, r);
for(i = 0; i < r; i++){
printf("%d ", test[i]);
}
printf("\n");
}
这里要注意下数组的下标。算法导论的伪代码是从1开始的。
当然实际应用中的话,是用不着自己写快速排序的。直接调用glibc中的接口即可,其性能比自己写的强多了。
man qsort了解下,这里就不贴了。