题解 | #明明的随机数# 老实人做法

明明的随机数

http://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0

看到评论区有人直接用map存储,直接解决了去重和排序,果然是秀儿啊!
这里分享一个老实人的做法

  1. 首先是删除重复元素,这里借鉴一下 LC26删除有序数组中的重复项的做法,首先sort,然后原地交换,最后将数组resize;
  2. 然后就是排序,写一个归并,归并排序是稳定的,时间复杂度为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;
    }
刷题总结类 文章被收录于专栏

这里记录一些刷题时候的总结思考

全部评论

相关推荐

11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
没有offer的小土豆:专业面试一般是分配面试官然后联系你面试 应该是还没给你分配对应面试官
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务