[玩转算法]基础算法思路的应用
来源:互联网 发布:阿里云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;}
阅读全文
0 0
- [玩转算法]基础算法思路的应用
- HOG算法思路和应用
- 算法的分析思路
- 算法的分析思路
- 算法的分析思路
- POJ前面的题目算法思路【转】
- SPFA算法的基础变形应用
- 算法基础:Stack堆栈的应用
- 算法思路
- 算法思路
- 【算法基础】----贪心算法的应用之Huffman编码
- 算24的算法思路
- 连连看寻路算法的思路
- 天梯匹配算法的思路
- MapReduce 的一些算法思路
- [玩转算法面试]什么是算法面试?
- [玩转算法]数组问题
- [玩转算法]滑动窗口
- 2017-8-10 Struts2学习笔记二
- C# winform 右键下拉菜单
- 智能手机检测
- linux中内存泄漏的检测(五)记录内存泄漏的代码
- 哈哈哈
- [玩转算法]基础算法思路的应用
- (吴恩达笔记 1-1)——线性回归原理
- 使用Toad插件SQLTracker追踪应用程序与数据库的交互
- C语言 读文件时多读一次最后一行数据的解决办法
- HDU6105 [2017duoxiaolianhe6] Gameia 博弈你个香蕉船
- springmvc 文件下载
- 涨姿势了,蜻蜓FM源码剖析
- 2017HDU多校第6场
- HDU 6098 Inversion