算法刷题小总结
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中没有有效语句