【数组】283. 移动零-双指针

题目:

 

 

解答:

方法一:

当我们遇到一个非零元素时,我们需要交换当前指针和慢速指针指向的元素,然后前进两个指针。如果它是零元素,我们只前进当前指针。

 1 class Solution {
 2 public:
 3     void moveZeroes(vector<int>& nums) 
 4     {
 5         int slow = 0;
 6         int fast = 0;
 7         for (int fast = 0; fast < nums.size(); fast++)
 8         {
 9             if (nums[fast] != 0)
10             {
11                 swap(nums[slow], nums[fast]);
12                 slow++;
13             }
14         } 
15     }
16 };

 

方法二:

解决方案:快慢指针,交换

分析题意:总之两句话,把0都移动到后面,非零的前后顺序还不能变。

解题思路: (1 )移动0就是交换后面非0的到前面。 (2 )顺序不能变,也就是交换的时候要跟数组中最前面的0交换。

应对策略: 两个指针,一快,一慢,快的始终指向下一个元素,判断是否可以交换到前面的(跟0交换)。 慢的始终指向此时此刻最前面的0的位置。

  • 慢指针如何移动?发现不是0就移动。
  • 快指针如何移动?每次直接移动一位,用来取下一个数。
  • 快指针始终领先慢指针,始终指向下一个待判断是否需要移动的数。
 1 class Solution {
 2 public:
 3     void moveZeroes(vector<int>& nums) 
 4     {
 5         if(nums.size() == 0)
 6         {
 7             return;
 8         }
 9 
10         int l = 0;
11         int r = 0;
12         while(r < nums.size())
13         {
14             if(nums[l] !=0)
15             {
16                 l++;
17             }
18             else
19             {
20                 if(nums[r] != 0)
21                 {
22                     nums[l] = nums[l] ^ nums[r];
23                     nums[r] = nums[l] ^ nums[r];
24                     nums[l] = nums[l] ^ nums[r];
25                     l++;
26                }
27             }
28             r++; //始终后移一位,取下一个数。
29         }
30         
31     }
32 };

 

posted @ 2020-05-04 17:11  梦醒潇湘  阅读(251)  评论(0)    收藏  举报