[玩转算法]数组问题
来源:互联网 发布:电脑开机进不了windows 编辑:程序博客网 时间:2024/05/16 09:46
数组问题
排序:选择排序;插入排序;归并排序;快速排序
查找:二分查找法
数据结构:栈;队列;堆
……
如何写出正确的程序
明确变量的含义
循环不变量
小数据量调试
大数据量测试
leetcode
283.Move Zeros问题
给定一个数组nums,写一个函数,将函数中所有的0挪到数组的末尾,而维持其他非0元素的相对位置.
举例:nums = [0,1,0,3,12],函数运行后结果为[1,3,12,0,0]
代码:
#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution{public:#if 0 //方法1 //时间复杂度:O(n) //空间复杂度:O(n) void moveZeroes(vector<int>& nums){ vector<int> nonZeroElements; for(int i = 0; i < nums.size(); i++){ if(nums[i]){ nonZeroElements.push_back(nums[i]); } } for(int i = 0; i < nonZeroElements.size(); i++){ nums[i] = nonZeroElements[i]; } for(int i = nonZeroElements.size(); i < nums.size(); i++){ nums[i] = 0; } }#endif //方法2 //优化算法,不需要接触辅助空间 //时间复杂度O(n) //空间复杂度O(1) void moveZeroes(vector<int>& nums){ int k = 0; //nums中,[0,k]的元素均为非0元素 //遍历到第i个元素后,保证[0,i]中所有非0元素 //都按照顺序排列在[0,k]中 for(int i = 0; i < nums.size(); i++){ if(nums[i]){ nums[k++] = nums[i]; } } //将nums剩余的位置放置为0 for(int i = k; i < nums.size(); i++){ nums[i] = 0; } } //方法3 void moveZeroes2(vector<int>& nums){ int k = 0; //遍历到i后,保证[0,i]都是非0值 for(int i = 0; i < nums.size(); i++){ if(nums[i]){ if(i != k){ swap(nums[k++],nums[i]); } else{ //i == k k++; } } } } };int main(){ int arr[] = {0,1,0,3,12}; vector<int> vec(arr,arr+sizeof(arr)/sizeof(int)); vector<int> vec2(arr,arr+sizeof(arr)/sizeof(int)); Solution().moveZeroes(vec); Solution().moveZeroes2(vec2); for(int i = 0; i < vec.size(); i++){ cout << vec[i] << " "; } cout << endl; for(int i = 0; i < vec2.size(); i++){ cout << vec2[i] << " "; } cout << endl; return 0;}
27.Remove Element
给定一个数组nums和一个数值val,将数组中所有等于val的元素删除,并返回剩余的元素个数.
需考虑的问题有:
·如何定义删除?从数组中去除?还是放在数组末尾?
·剩余元素的排列是否要保证原有的相对顺序?
·是否有空间复杂度的要求?O(1)
#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution{public: //空间复杂度O(1) //时间复杂度O(n) int RemoveElement(vector<int>& nums,int val){ int ele= 0; int count = 0; while(ele < nums.size()){ if(nums[ele] != val){ nums[count] = nums[ele]; count++; } ele++; } return count; }};int main(){ int arr[] = {1,3,4,6,7,8,3}; vector<int> vec(arr,arr+sizeof(arr)/sizeof(int)); int count = Solution().RemoveElement(vec,3); cout << count << endl; for(int i = 0; i < count; i++){ cout << vec[i] << " "; } cout << endl; return 0;}
26.Remove Duplicated from Sorted Array
给定一个有序数组,对数组中的元素去重,使得原数组中的每个元素只有一个。返回去重数组的长度值。
需考虑的问题有:
·如何定义删除?从数组中去除?还是放在数组末尾?
·剩余元素的排列是否要保证原有的相对顺序?
·是否有空间复杂度的要求?O(1)
#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution{public: int RemoveDuplicated(vector<int>& nums){ int count = 0; int ele = 1; while(ele < nums.size()){ if(nums[ele] != nums[ele - 1]) { nums[count] = nums[ele -1]; count++; } ele++; } nums[count] = nums[nums.size() - 1]; count++; return count; }};int main(){ int arr[] = {1,2,2,3,3,4,5,6,7,8,8}; vector<int> vec(arr,arr+sizeof(arr)/sizeof(int)); int count = Solution().RemoveDuplicated(vec); cout << count << endl; for(int i = 0; i < count; i++){ cout << vec[i] << " "; } cout << endl; return 0;}
80.Remove Duplicated from Sorted Array II
给定一个有序数组,对数组中的元素去重,使得原数组的每个元素最多保留两个,返回去重后数组的长度值。
·如nums = [1,1,1,2,2,3]
·结果应返回5,且nums的前五个元素为1,1,2,2,3
#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution{public: int RemoveDuplicated(vector<int>& nums){ int count = 0; int ele1 = 0; int ele2 = 1; while(ele2 < nums.size() - 1){ if(nums[ele2] != nums[ele1]) { nums[count] = nums[ele1]; count++; if(nums[ele2+1] == nums[ele2]){ nums[count] = nums[ele2]; count++; } } ele1++; ele2++; } if(ele2 == nums.size() - 1){ nums[count] = nums[ele2]; count++; } return count; }};int main(){ int arr[] = {1,2,2,3,3,3,3,4,4,4,5,6,7,8,8,8}; vector<int> vec(arr,arr+sizeof(arr)/sizeof(int)); int count = Solution().RemoveDuplicated(vec); cout << count << endl; for(int i = 0; i < count; i++){ cout << vec[i] << " "; } cout << endl; return 0;}
阅读全文
0 0
- [玩转算法]数组问题
- 玩转算法面试-数组
- 玩转C语言数组各种算法小结
- 玩转字符数组1
- 玩转经典算法之字符串匹配(一) 问题引入和朴素的匹配算法
- [玩转算法]滑动窗口
- 玩转算法面试-查找
- [玩转算法面试]什么是算法面试?
- 玩转php数组(一)
- 玩转php数组(二)
- 玩转php数组(三)
- 玩转php数组(一)
- 玩转php数组(二)
- 玩转php数组(三)
- 冒泡算法-之玩转代码
- 玩转算法面试-面试分析
- 玩转算法面试-时间复杂度分析
- [玩转算法]对撞指针
- java volatile理解
- 2017年阿里巴巴Java开发工程师面试总结
- 通过id获取元素坐标
- 添加右上UIBarButton
- mysql的存储函数和存储过程
- [玩转算法]数组问题
- 【雪野实训记录】Oracle数据库 T2作业——基本SQL查询
- 4:求特殊自然数(程序设计与算法(一)第四周测验(2017夏季))
- 802.11 学习资料汇总
- DEDECMS点击主栏目默认显示第一个子栏目列表的方法
- css解决文字单行两端对齐(兼容ie7)
- oracle中decode()函数的用法
- Android进阶之路
- Linux服务器时间同步