第一種解法:用空間換時間,設倆個值i,j相當於兩個指針,i指向0,j指向非0,j遇到非0,將j的值賦值i,如果i與j不相等,i的值就賦予0
時間複雜度 O(n) 空間複雜度O(1)
java描述
public void moveZeroes(int[] nums) {
int j=0;
for (int i=0;i<nums.length;++i){
if (nums[i]!=0){
nums[j]=nums[i];
if (i!=j){
nums[i]=0;
}
++j;
}
}
}C++描述
void moveZeroes(vector<int>& nums) {
int j = 0;
for(int i = 0;i<nums.size();i++) {
if (nums[i] != 0) {
nums[j] = nums[i];
if(i != j){
nums[i] = 0;
}
j++;
}
}
}
第二種解法:兩個循環,第一個循環將非零值從小標爲0開始填入,第二個循環接着後面填入0
時間複雜度 O(n) 空間複雜度O(1)
java描述
public void moveZeroes(int[] nums) {
int noneZeroFundAt = 0;
for (int i = 0; i < nums.length; i++){
if (nums[i] != 0){
nums[noneZeroFundAt++] = nums[i];
}
}
for (int i = noneZeroFundAt; i < nums.length; i++){
nums[i] = 0;
}
}
C++描述
void moveZeroes(vector<int>& nums) {
int lastNoneZeroFundAt = 0;
for (int i = 0; i < nums.size(); i++){
if (nums[i] != 0){
nums[lastNoneZeroFundAt++] = nums[i];
}
}
for (int i = lastNoneZeroFundAt; i < nums.size(); i++){
nums[i] = 0;
}
}
第三種解法:倆個值,相當於兩個指針,遇到非零的就互換
時間複雜度 O(n) 空間複雜度O(1)
c++ 解法
void moveZeroes(vector<int>& nums) {
for (int lastNoneZeroFundAt = 0, cur = 0; cur < nums.size(); cur++){
if(nums[cur] != 0){
swap(nums[lastNoneZeroFundAt++], nums[cur]);
}
}
}
第四種解法:滾雪球解法
時間複雜度 O(n) 空間複雜度O(1)
public void moveZeroes(int[] nums) {
int snowBallSize = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
snowBallSize++;
}else if (snowBallSize > 0) {
int temp = nums[i];
nums[i] = 0;
nums[i - snowBallSize] = temp;
}
}
}