题解 | #明明的随机数# 老实人做法
明明的随机数
http://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0
看到评论区有人直接用map
存储,直接解决了去重和排序,果然是秀儿啊!
这里分享一个老实人的做法
- 首先是删除重复元素,这里借鉴一下
LC26
删除有序数组中的重复项的做法,首先sort,然后原地交换,最后将数组resize
; - 然后就是排序,写一个归并,归并排序是稳定的,时间复杂度为O(Nlog2N)
#include<bits/stdc++.h> class Sol { public: static void myDelete(std::vector<int>& nums) { std::sort(nums.begin(), nums.end()); int i = 0, j = 1; for (; j < nums.size(); ++j) { if (nums[i] != nums[j]) { nums[i+1] = nums[j]; i++; } } nums.resize(i + 1); } static void mySort(std::vector<int>& nums) { //归并排序 分治思想 std::vector<int> tmp(nums.size()); mergeSort(nums, tmp, 0, nums.size() - 1); } static void mergeSort(std::vector<int>& nums, std::vector<int>& tmp, int left, int right) { if (left >= right) return; int mid = left + ((right - left) >> 1); mergeSort(nums, tmp, left, mid); mergeSort(nums, tmp, mid + 1, right); for (int k = left; k <= right; ++k) tmp[k] = nums[k]; int i = left, j = mid + 1; for (int k = left; k <= right; ++k) { if (i == mid + 1) { nums[k] = tmp[j++]; } else if (j == right + 1 || tmp[i] <= tmp[j]) { nums[k] = tmp[i++]; } else { nums[k] = tmp[j++]; } } } }; int main() { int len; std::vector<int> nums; while (std::cin >> len) { nums.resize(len); int tmp; for (int i = 0; i < len; ++i) { std::cin >> tmp; nums[i] = tmp; } Sol::myDelete(nums); Sol::mySort(nums); for (auto i : nums) std::cout << i << std::endl; } return 0; }
刷题总结类 文章被收录于专栏
这里记录一些刷题时候的总结思考