• [leetcode]Next Permutation


    下一个组合数。因为有数组内一部分的排序,c++更自然些。算法很简单,从末尾向开头找不合顺序的,然后调换,然后把后面的排序。调换要找到那个刚好比pivot大的元素,因为再小的,如果换过去,这些顺序已经排过了。

    #include <vector>
    #include <algorithm>
    using namespace std;
    
    class Solution {
    public:
        void nextPermutation(vector<int> &num) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
        	int idx = num.size() - 1;
            bool inorder = true;
        	while ( idx > 0) {
        		if ((num[idx] > num[idx-1])) {
                    inorder = false;
        			break;
        		}
        		idx--;
        	}  	
        	if (inorder) {
    			sort(num.begin(), num.end());
        		return;
        	}
            idx--;
        	// idx is the number need to be exchanged
        	int minIdx = INT_MAX;
        	for (int i = idx+1; i < num.size(); i++) {
        		if (num[i] > num[idx]) {
                    if (minIdx == INT_MAX || num[i] < num[minIdx])
        			{
        				minIdx = i;
        			}
        		}
        	}
        	swap(num, idx, minIdx);
    		sort(num.begin() + idx + 1, num.end());
        }
        
        void swap(vector<int> &num, int a, int b) {
        	int tmp = num[a];
        	num[a] = num[b];
        	num[b] = tmp;
        }
    };
    

    第二遍:之前的方法里面用了sort,其实不算是O(n)的。C++库里面的方法是用reverse,原因是swap之后,后半部分其实正好倒序,这样reverse就相当于sort了。如果用sort,Annie的写法更简洁。https://github.com/AnnieKim/LeetCode/blob/master/NextPermutation.h 

    class Solution {
    public:
        void nextPermutation(vector<int> &num) {
            int i = num.size() - 1;
            while (i > 0 && num[i] <= num[i-1])
                i--;
            if (i == 0)
            {
                reverse(num, 0, num.size()-1);
                return;
            }
            int pivot = num[i-1];
            int idx = -1;
            for (int j = num.size()-1; j >= i; j--)
            {
                if (idx == -1 && num[j] > pivot)
                {
                    idx = j;
                }
                else if (idx != -1 && num[j] > pivot && num[j] < num[idx])
                {
                    idx = j;
                }
            }
            swap(num, i-1, idx);
            reverse(num, i, num.size()-1);
        }
        
        void reverse(vector<int> &num, int l, int r)
        {
            while (l < r)
            {
                swap(num, l, r);
                l++;
                r--;
            }
        }
        
        void swap(vector<int> &num, int i, int j)
        {
            int tmp = num[i];
            num[i] = num[j];
            num[j] = tmp;
        }
    };
    

      

  • 相关阅读:
    Mysql 命令行连接
    linux下安装MongoDB数据库
    SVN 提交常见报错及解决方案
    解决 SVN Skipped 'xxx' -- Node remains in conflict
    linux svn 切换用户
    SQL基础语法
    yml
    搭建笔记(1)
    文件上传MultipartFile
    18.线程池
  • 原文地址:https://www.cnblogs.com/lautsie/p/3234507.html
Copyright © 2020-2023  润新知