题一:最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。
示例 1:
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被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;
}