classSolution{public:intlenLongestFibSubseq(vector<int>& arr){
unordered_map<int,int> indices;// 建立元素和下标的哈希关系int n = arr.size();for(int i =0; i < n; i++){
indices[arr[i]]= i;}
vector<vector<int>>dp(n,vector<int>(n));int ans =0;for(int i =0; i < n; i++){// 反向遍历每个比i小的元素for(int j = i -1; j >=0&& arr[j]*2> arr[i]; j--){int k =-1;// 判断是否找的到fib序列中的第一个数if(indices.count(arr[i]- arr[j])){
k = indices[arr[i]- arr[j]];}// 如果找到了,那么就更新dp[j][i]if(k >=0){
dp[j][i]=max(dp[k][j]+1,3);}
ans =max(ans, dp[j][i]);}}return ans;}};
658. 找到 K 个最接近的元素(128)
代码实现(自解)
classSolution{public:
vector<int>findClosestElements(vector<int>& arr,int k,int x){// 将x先插入arr中int n = arr.size();int cur, i;/*
for (i = 0; i < n; i++) {
if (x > arr[i]) continue;
arr.emplace(arr.begin() + i, x);
cur = i;
break;
}
if (i == n) {
arr.push_back(x);
cur = n;
}
*/auto it =lower_bound(arr.begin(), arr.end(), x);
cur = it - arr.begin();// n++;
vector<int> ans;int l = cur -1;int r = cur;int lGap, rGap;for(int i =0; i < k; i++){if(r >= n){
ans.emplace(ans.begin(), arr[l--]);continue;}if(l <0){
ans.push_back(arr[r++]);continue;}
lGap =abs(arr[l]- x);
rGap =abs(arr[r]- x);if(lGap <= rGap){
ans.emplace(ans.begin(), arr[l--]);}else{
ans.push_back(arr[r++]);}}return ans;}};
1894. 找到需要补充粉笔的学生编号(129)
代码实现(自解)
classSolution{public:intchalkReplacer(vector<int>& chalk,int k){int n = chalk.size();int i =0;longlong sum =0;for(int i =0; i < n; i++){
sum += chalk[i];if(sum > k)return i;}
k %= sum;while(chalk[i]<= k){
k -= chalk[i];
i =(i +1)% n;}return i;}};