[玩转算法]基础算法思路的应用

来源:互联网 发布:阿里云ecs ftp 编辑:程序博客网 时间:2024/06/14 03:12

基础算法思路的应用

75. Sort Colors

给定一个有n个元素的数组,数组中元素的取值只有0,1,2三种可能。为这个数组排序。

·可以使用任意一种排序算法

·没有使用上题目给出的特殊条件

计数排序:分别统计0,1,2的元素的个数

 

#include <iostream>#include <vector>#include <cassert>using namespace std;class Solution{public:#if 0    //时间复杂度O(n)    //空间复杂度O(1)    void sortColors(vector<int>& nums){        int count[3] = {0}; //存放0,1,2三个元素的频率        for(int i = 0; i < nums.size(); i++){            assert(nums[i] >= 0 && nums[i] <= 2);            count[nums[i]]++;        }        int index = 0;        for(int i = 0; i < count[0]; i++)            nums[index++] = 0;        for(int i = 0; i < count[1]; i++)            nums[index++] = 1;        for(int i = 0; i < count[2]; i++)            nums[index++] = 2;    }#endif    //时间复杂度:O(n)    //空间复杂度:O(1)    //遍历一遍    void sortColors(vector<int>& nums){        int zero = -1;  //nums[0...zero] == 0        int two = nums.size();       //nums[two...n-1] == 2        for(int i = 0; i < two; ){            if(nums[i] == 1){                i++;            }            else if(nums[i] == 2){                swap(nums[i],nums[--two]);            }            else{ //nums[i] == 0                assert(nums[i] == 0);                zero++;                swap(nums[zero],nums[i]);                i++;            }        }    }};int main(){    int arr[] = {0,2,1,2,2,0,1};    vector<int> vec(arr,arr+sizeof(arr)/sizeof(int));    Solution().sortColors(vec);    for(int i = 0; i < vec.size();i++){        cout << vec[i] << " ";    }    cout << endl;    return 0;}

88.Merge Sorted Array

给定两个有序的整型数组nums1,nums2,将nums2的元素归并到nums1中

 

#include <iostream>#include <vector>#include <cassert>using namespace std;class Solution{public:    void mergeSort(vector<int>& nums1,vector<int>& nums2){        int l = 0;        int r = 0;        vector<int> vec;        for(int i = 0; i < (nums1.size() + nums2.size()); i++){             assert(l <= nums1.size() && r <= nums2.size());            if(nums1[l] <= nums2[r]){                vec.push_back(nums1[l]);                l++;            }            else{                vec.push_back(nums2[r]);                r++;            }        }        nums1.clear();        for(int i = 0; i < vec.size(); i++){            nums1.push_back(vec[i]);        }    }};int main(){    int nums1[] = {3,5,7,8,10};    int nums2[] = {3,4,5,6,9};    vector<int> vec1(nums1,nums1+sizeof(nums1)/sizeof(int));    vector<int> vec2(nums2,nums2+sizeof(nums2)/sizeof(int));    Solution().mergeSort(vec1,vec2);    for(int i = 0; i < vec1.size(); i++){        cout << vec1[i] << " ";    }    cout << endl;    return 0;}

215.Kth Largest Element in an Array

在一个整数序列中寻找第k大的元素

如给定数组[3,2,1,5,6,4],k = 2,结果为5

 

利用快排partition中,将pivot放置在其正确的位置上

#include <iostream>#include <vector>#include <cassert>#include <algorithm>using namespace std;class Solution{public:    int FindKthLargest(vector<int>& nums,int Kth){        assert(Kth > 0);        int pivot = nums.size() - Kth;        for(int i =0; i < nums.size();i++){            if(nums[i] > nums[pivot] && i < pivot){                swap(nums[i],nums[pivot]);            }            else if(nums[i] < nums[pivot] && i > pivot){                swap(nums[i],nums[pivot]);                for(int j = 0; j < pivot; j++){                    if(nums[j] > nums[pivot]){                        swap(nums[j],nums[pivot]);                    }                }            }        }        return nums[pivot];    }};int main(){    int nums[] = {3,5,4,2,5,7,3,9,10};    vector<int> vec(nums,nums+sizeof(nums)/sizeof(int));    int num = Solution().FindKthLargest(vec,9);    cout << num << endl;    return 0;}