数组问题
排序:选择排序;插入排序;归并排序;快速排序
查找:二分查找法
数据结构:栈;队列;堆
……
如何写出正确的程序
明确变量的含义
循环不变量
小数据量调试
大数据量测试
leetcode
283.Move Zeros问题
给定一个数组nums,写一个函数,将函数中所有的0挪到数组的末尾,而维持其他非0元素的相对位置.
举例:nums = [0,1,0,3,12],函数运行后结果为[1,3,12,0,0]
代码:
#include
#include
#include
using namespace std;
class Solution{
public:
#if 0
//方法1
//时间复杂度:O(n)
//空间复杂度:O(n)
void moveZeroes(vector& nums){
vector 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& 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& 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 vec(arr,arr+sizeof(arr)/sizeof(int));
vector 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
#include
#include
using namespace std;
class Solution{
public:
//空间复杂度O(1)
//时间复杂度O(n)
int RemoveElement(vector& 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 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
#include
#include
using namespace std;
class Solution{
public:
int RemoveDuplicated(vector& 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 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
#include
#include
using namespace std;
class Solution{
public:
int RemoveDuplicated(vector& 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 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;
}