leetcode 283 Move Zeros; 27 Remove Elements; 26 Remove Duplicated from Sorted Array;


int arr[] = {,,,,};
//把数组的值赋给vector
vector<int> vec(arr, arr+sizeof(arr)/sizeof(int));
解法一:
时间复杂度O(n)
空间复杂度O(1)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k = ; //nums中,[0,...k)的元素均为非0元素
//遍历到第i个元素后,保证[0,...i)中所有非0元素
//都按照顺序排列在[0,...k)中
for(int i=;i<nums.size();i++){
if(nums[i]){
nums[k++] = nums[i];
}
}
//将nums剩余的位置放置为0
for(int i=k;i<nums.size();i++)
nums[i] = ;
}
};
解法二:将非0元素与0元素交换位置,其中k指向非零元素的位置,且为了不让两个0元素之间相互交换位置,则增加一个判断条件( i != k)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k = ; //nums中,[0,...k)的元素均为非0元素
//遍历到第i个元素后,保证[0,...i)中所有非0元素
//都按照顺序排列在[0,...k)中
//同时,[k,...i]为0
for(int i=;i<nums.size();i++){
if(nums[i]){
if(i!=k)
swap(nums[k++] , nums[i]);
else
k++;
}
}
}
};


我用了一个比较简便的解法,使用了vector的erase()函数直接删除等于val的元素(相当于下标自动加了一,即表示的是删除元素的下一个元素),剩余的元素个数可以直接由size()得到。
需注意的:不能使用remove()的原因是:它是将等于val的元素放到vector的尾部,返回新的end()值(非val部分的end),但并不减少vector的size。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = ;
int i = ;
while(i<nums.size()){
if(nums[i] == val)
nums.erase(nums.begin()+i); //删除下标为i的元素
else
i++;
}
return nums.size();
}
};

所以要考虑上述三个问题。

解法一:快慢指针。用两个指针,慢指针来记录不重复元素的个数,快指针遍历整个数组,若慢指针指向的元素不等于快指针指向的元素,则赋值。
注意:判断当数组的长度为0时返回0,否则容易出现野指针报错。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty())
return 0;
int count=0; //记录不重复元素的个数
int j=1; //遍历整个vector
while(j<nums.size()){
if(nums[count] != nums[j]){
count++;
nums[count] = nums[j];
}
j++;
}
return count+1;
}
};
解法二:(24s)
和解法二的思路相似,执行时间较多,比较相邻两个元素是否相同,若相同则i++;若不相同则将nums[i]赋给nums[k]。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) return ;
int k = ;
for (int i = ; i < nums.size(); ++i)
{
if (nums[i] != nums[i - ])
{
nums[k++] = nums[i]; k++的作用是最终的k是数组的长度
}
}
return k;
}
};

思路:k记录最多重复两次的数组下标,若( 下标为i的元素不等于k) 或者(i等于k 但是 k和k-1不相等) 则把下标为i的元素赋给k+1的元素
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=) return nums.size();
int k=; //k记录最多重复两次的数组下标
for(int i=;i<nums.size();i++){
if(nums[i]!=nums[k] || (nums[i]==nums[k] && nums[k]!=nums[k-]) )
nums[++k] = nums[i];
}
return k+;
}
};
leetcode 283 Move Zeros; 27 Remove Elements; 26 Remove Duplicated from Sorted Array;的更多相关文章
- LeetCode 283 Move Zeros
Problem: Given an array nums, write a function to move all 0's to the end of it while maintaining th ...
- 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array
乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...
- LN : leetcode 283 Move Zeroes
lc 283 Move Zeroes 283 Move Zeroes Given an array nums, write a function to move all 0's to the end ...
- [LeetCode] 283. Move Zeroes 移动零
Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...
- LeetCode 283. Move Zeroes (移动零)
Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...
- LeetCode 283 Move Zeroes 解题报告
题目要求 Given an array nums, write a function to move all 0's to the end of it while maintaining the re ...
- leetcode 283. Move Zeroes -easy
题目链接:https://leetcode.com/problems/move-zeroes/ 题目内容: Given an array nums, write a function to move ...
- Java [Leetcode 283]Move Zeroes
题目描述: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...
- Leetcode 283 Move Zeroes python
题目: Given an array nums, write a function to move all 0's to the end of it while maintaining the rel ...
随机推荐
- ubunt 14.04 Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. Modul
CMake Error: Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. Modul ...
- npm 升级
当我们运行某个项目是 会提示 > my-first-vue-project@1.0.0 dev C:\Users\ASUS\my-project > node build/dev-serv ...
- 1.python系统性能信息模块之psutil模块
Psutil(进程和系统实用程序)是一个跨平台的库,用于在Python中检索有关运行进程和系统资源利用率(CPU,内存,磁盘,网络)的信息.它主要用于系统监视,分析和限制系统资源及运行进程的管理.它实 ...
- redis的一些简介
Redis是Remote Dictionary Server的缩写,他本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库. 1. redis的数据类型: st ...
- js 简单抽奖实现
大家在很多活动页面上都看到绚丽多彩的抽奖运用,网上也有比较多关于这方面的js和用as.今天我在工作的时候也要做个抽奖的运用.我之前没有写过这类的js,也不会as,就得屁颠屁颠的问度娘啦,虽然找到有js ...
- RPLiDAR 激光雷达探测地面高程
LiDAR,又称激光探测与测量,全程Light Detection And Ranging,这种技术使用激光测量地物(如森林和建筑物)的高程.它的原理十分类似于使用声波来测绘海底地形的声呐技术,或使用 ...
- 20169219 SQL注入实验报告
实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框.输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令. 在 ...
- poj2299 Ultra-QuickSort(线段树求逆序对)
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- easyui SWFUpload
业务背景:实现一个用药人的增加功能,用药人信息中包含附件.如题所示,主要讨论easyui上传的实现.jsp页面代码(弹出框),一个简单的增加页面 div id=addMedicationDlg cla ...
- Stomp与Jackson
读取Stomp消息的类在StompDecoder中,org.springframework.messaging.simp.stomp.StompDecoder. Jackson把json转对象是在如下 ...