【題目鏈接】
ybt 1245:不重復地輸出數
OpenJudge NOI 1.11 08:不重復地輸出數
【題目考點】
1. 二分查找
2. 復雜度為O(nlogn)的排序
- 快速排序:時間復雜度O(nlogn),額外空間復雜度O(1),不穩定
- 歸并排序:時間復雜度O(nlogn),額外空間復雜度O(n),穩定
【解題思路】
解法1:插入排序+二分查找
維護一個升序數組。
每讀入一個數字,先通過二分查找判斷數組中是否存在該數字。
- 如果存在,那么就略過。
- 如果不存在,就將該數字通過插入排序的方法插入到數組中,保持數組是升序的。
最后輸出整個數組。
解法2:O(nlogn)排序算法
輸入數據的規模為10510^5105,可以使用復雜度為O(nlogn)的排序算法將其排序,然后遍歷數組,輸出時如遇到相同的元素,則只輸出一個。
【題解代碼】
解法1:插入排序+二分查找
#include<bits/stdc++.h>
using namespace std
;
#define N 100005
int a
[N
], an
;
bool isFound(int x
)
{int l
= 1, r
= an
, m
;while(l
<= r
){m
= (l
+ r
) / 2;if(x
< a
[m
])r
= m
- 1;else if(x
> a
[m
])l
= m
+ 1;elsereturn true;}return false;
}
int main()
{int n
, x
;cin
>> n
;for(int i
= 1; i
<= n
; i
++){cin
>> x
;if(isFound(x
) == false){a
[++an
] = x
;for(int j
= an
; j
> 1; j
--){if(a
[j
] < a
[j
-1])swap(a
[j
], a
[j
-1]);elsebreak; }}}for(int i
= 1; i
<= an
; ++i
)cout
<< a
[i
] << ' ';return 0;
}
#include<bits/stdc++.h>
using namespace std
;
#define N 100005
int a
[N
], an
;
int main()
{int n
, x
;cin
>> n
;for(int i
= 1; i
<= n
; i
++){cin
>> x
;if(binary_search(a
+1, a
+1+an
, x
) == false){a
[++an
] = x
;for(int j
= an
; j
> 1; j
--){if(a
[j
] < a
[j
-1])swap(a
[j
], a
[j
-1]);elsebreak; }}}for(int i
= 1; i
<= an
; ++i
)cout
<< a
[i
] << ' ';return 0;
}
解法2:O(nlogn)排序
快速排序
#include<bits/stdc++.h>
using namespace std
;
#define N 100005
int a
[N
];
void qsort(int l
, int r
)
{int i
= l
, j
= r
, mid
= a
[(l
+r
)/2];while(i
<= j
){while(a
[i
] < mid
)i
++;while(a
[j
] > mid
)j
--;if(i
<= j
){swap(a
[i
], a
[j
]);i
++, j
--;}}if(l
< j
)qsort(l
, j
);if(i
< r
)qsort(i
, r
);
}
int main()
{int n
, x
;cin
>> n
;for(int i
= 1; i
<= n
; i
++)cin
>> a
[i
];qsort(1, n
);cout
<< a
[1] << ' ';for(int i
= 2; i
<= n
; ++i
)if(a
[i
] != a
[i
-1])cout
<< a
[i
] << ' ';return 0;
}
#include<bits/stdc++.h>
using namespace std
;
#define N 100005
int a
[N
];
int main()
{int n
, x
;cin
>> n
;for(int i
= 1; i
<= n
; i
++)cin
>> a
[i
];sort(a
+1, a
+1+n
);cout
<< a
[1] << ' ';for(int i
= 2; i
<= n
; ++i
)if(a
[i
] != a
[i
-1])cout
<< a
[i
] << ' ';return 0;
}
歸并排序
#include<bits/stdc++.h>
using namespace std
;
#define N 100005
int a
[N
], t
[N
];
void msort(int l
, int r
)
{if(l
>= r
)return;int m
= (l
+r
)/2;msort(l
, m
);msort(m
+1, r
);int ti
= l
, li
= l
, ri
= m
+1;while(li
<= m
&& ri
<= r
){if(a
[li
] < a
[ri
])t
[ti
++] = a
[li
++];elset
[ti
++] = a
[ri
++];}while(li
<= m
)t
[ti
++] = a
[li
++];while(ri
<= r
)t
[ti
++] = a
[ri
++];for(int i
= l
; i
<= r
; ++i
)a
[i
] = t
[i
];
}
int main()
{int n
, x
;cin
>> n
;for(int i
= 1; i
<= n
; i
++)cin
>> a
[i
];msort(1, n
);cout
<< a
[1] << ' ';for(int i
= 2; i
<= n
; ++i
)if(a
[i
] != a
[i
-1])cout
<< a
[i
] << ' ';return 0;
}
#include<bits/stdc++.h>
using namespace std
;
#define N 100005
int a
[N
];
int main()
{int n
, x
;cin
>> n
;for(int i
= 1; i
<= n
; i
++)cin
>> a
[i
];stable_sort(a
+1, a
+1+n
);cout
<< a
[1] << ' ';for(int i
= 2; i
<= n
; ++i
)if(a
[i
] != a
[i
-1])cout
<< a
[i
] << ' ';return 0;
}
總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。