【LeetCode两题选手】算法类题目(7.30)

题一:最长连续递增序列

给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。

示例 1:

输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为57在原数组里被4隔开。 
示例 2:

输入: [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1

注意:数组长度不会超过10000。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

都说熟能生巧了,这种题型嘛,快慢指针加哨兵,很直接的。

代码实现

	int findLengthOfLCIS(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int length=1,len=1;
        
        for(int i=0;i<nums.size()-1;i++) {
            if(nums[i]<nums[i+1]) {
                length++;
            } else {
                if(length>len) {
                    len=length;
                }
                length=1;
            } 
        }
        if(length>len) return length;
        else return len;
    }

题二:第K个全排列

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

"123"
"132"
"213"
"231"
"312"
"321"

给定 n 和 k,返回第 k 个排列。

说明:

给定 n 的范围是 [1, 9]。
给定 k 的范围是[1,  n!]。
示例 1:

输入: n = 3, k = 3
输出: "213"
示例 2:

输入: n = 4, k = 9
输出: "2314"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

emmm,问题有点严重,我发现我讲不清楚我的思路。。。
只能借花献佛了。。。
在这里插入图片描述
第一个数字是 1,即排列中的第一个元素是 nums[1] = 2。由于每个元素只能使用一次,则从 nums 中删除该元素。

在这里插入图片描述
阶乘中下一个系数为 0,即排列中 nums[0] = 1,然后从 nums 中删除该元素。

在这里插入图片描述
阶乘中下一个系数也是 0,即排列中 nums[0] = 3,然后从 nums 中删除该元素。

在这里插入图片描述

哎,怎么说呢,这几张图不知道能不能明确的表达我要表达的意思。。。

就是从头开始一个一个数的找,找数的算法图里也有了,找到那个数之后,从备选数池把那个数移去,循环前面的动作,直到数池中没数。
数池:如果给定N = 4,那么数池就是{1,2,3,4}。
找数的算法:假设 K = 13,则第一个数下属的情况有 (N-1)! = 6,那么第一个被选中的数就是 K/6 = 2,对应数池中的[1]处的数值。

代码实现

String getPermutation(int n, int k) {

    vector<int> f(n,0);
    f[0] = 1;
    for(int i = 1;i<n;i++){
        f[i] = i*f[i-1];
    }
    list<int> nums;
    for(int i = 1;i<=n;i++){
        nums.push_back(i);
    }
    
    k--;//错位,索引从0开始
    string sb;
    
    for(int i = n-1;i>=0;i--){//总共是n个数
        int idx = k/f[i];
        sb.append(nums[idx]);
        nums.remove(nums[idx]);//将使用后的数字删除
        k %= f[i];
    }

    return sb;
}

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/107657553