每日一题:LeetCode 31 下一个排列

总结


本题思路主要是找到 较小值(从后往前(下标n - 2开始)小于它后面的数的对应点i)找到i后再从后往前一遍(从n - 1开始),找到大于i的下标。之后对i和j进行swap,然后翻转i + 1及其后的数组。(由于先前第一次遍历时候,i后面的排序必是降序,故只需翻转)

在此附上代码及出处

  • JAVA

public void nextPermutation(int[] nums){
      int n = nums.length;
      int i = n - 2,j = n - 1;
      while(i >= 0 && nums[i] >= nums[i + 1]){
            i--;
      }
      if(i >= 0){
            while(j >= 0 && nums[i] >= nums[j]){
                  j--;
            }
            swap(nums,i,j);
            
      }
      reverse(nums,i + 1);
}
      public void swap(int[] nums,int x, int y){
            int tmp = nums[x];
            nums[x] = nums[y];
            nums[y] = tmp;
      }
      public void reverse(int[] nums,int start){
            int l = start, r = nums.length - 1;
            while(l < r){
                  swap(nums,l,r);
                  l++;
                  r--;
            }
      }


  • C++
      
public:
      void nextPermutation(vector<int> & nums){
            int n = nums.size();
            int i = n - 2, j = n - 1;
            while(i >= 0 && nums[i] >= nums[i + 1]){
                  i--;
            }
            if(i >= 0){
                  while(j >= 0 && nums[i] >= nums[j]){
                        j--;
                  }
                  swap(nums[i], nums[j]);
            }
            reverse(nums.begin() + i + 1,nums.end());
      }; 

原题

posted @ 2020-11-10 19:56  acchris  阅读(60)  评论(0)    收藏  举报