算法刷题小总结

1.有问题代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n = nums.size();
        int i = n-1;
        while(i > 0)
        {
            if(nums[i] <= nums[i-1]) i--;
            else  break;
        }
        if(i == 0)reverse(nums.begin(), nums.end()); 
        else {
        int k = i-1;
        while(i < n)
        {
            if(nums[i] - nums[k] > 0) i++;
            else{
                i--;    //这里在边界时(即i == n)不执行,故尝试把这个语句放在外面,则这个语句必定执行
                break;
            }
        }
        swap(nums[k], nums[i]);
        sort(nums.begin()+k+1, nums.end());    
    }
    }
};

问题:这种while()里面加了个if-else判断的话,如果处于边界时,else 语句块有可能不会执行里面的有效内容。

方法一:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n = nums.size();
       // if(n == 1) nums.push_back(-1);
        int i = n-1;
        while(i > 0)
        {
            if(nums[i] <= nums[i-1]) i--;
            else  break;
        }
        if(i == 0)
        {
          //  if(nums[n-1] < 0) nums.pop_back();
            reverse(nums.begin(), nums.end());
        }
        else {

        int k = i-1; //改动之后
        while(i < n)
        {
            if(nums[i] - nums[k] > 0) i++;
            else break;
        }
        swap(nums[k], nums[i-1]); // 改动之后
        sort(nums.begin()+k+1, nums.end());    
    }
    }
};

方法二:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n = nums.size();
        int i = n-1;
        while(i > 0 && nums[i] <= nums[i-1]) i--;
        if(i <= 0) reverse(nums.begin(), nums.end());
        else {
        int k = i;
        while (i < nums.size() && nums[i] > nums[k - 1]) i ++ ;
        swap(nums[k-1], nums[i-1]);
        sort(nums.begin()+k, nums.end());    
    }
    }
};

 

解决:把需要一定执行的语句放在while外面,这样即可解决问题

或  将while和if的判断语句都写在while中(如方法二)。前提是else中没有有效语句

posted @ 2020-11-30 09:31  ATKevin  阅读(117)  评论(0编辑  收藏  举报