关注
等差数列复盘
思路
设置k,i,j三个位置指针,k指向当前待判定序列的最左端点,i指向当前序列第一个不为-1的位置,j 指向当前序列第二个不为-1的位置。
求公差 d = (nums[j] - nums[i]) / (j - i); ,1. 若公差不为整数,说明 i 到 j 间不能构成等差序列 (例如1 -1 2 公差d为0.5,不符合题意) 2. 若 nums[j] - d*(j - k) <= 0) 说明最左面端点k值<=0 不符合题意。 则1.2两种情况均计数+1,指针k向右移动到 j 位置循环判断。
若可以构成等差序列,则指针k移动到 j+1位置向右寻找可以构成等差序列的最右端点。
c++:
#include<iostream>
(5488)#include<vector>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector<double> nums(n);
for (int i = 0; i < n; i++)
cin >> nums[i];
int cnt = 0, i, j, k = 0;
while (k < n)
{
cnt++;
i = k;
while (i < n && nums[i] == -1)
i++;
j = i + 1;
while (j < n && nums[j] == -1)
j++;
if (j >= n)
break;
double d = (nums[j] - nums[i]) / (j - i);
if (d - floor(d) || nums[j] - d*(j - k) <= 0)
{
k = j;
continue;
}
k = j + 1;
while (k < n && nums[j] + d*(k - j) > 0 && (nums[k] == -1 || nums[k] == nums[j] + d*(k - j)))
k++;
}
cout << cnt << endl;
}
return 0;
}
查看原帖
2 1
相关推荐
点赞 评论 收藏
分享
04-02 22:37
平顶山学院 算法工程师 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 给工作过的公司写一条大众点评,你会怎么写? #
1169次浏览 23人参与
# 牛油的搬砖plog #
189290次浏览 1272人参与
# 厦门银行科技岗值不值得投 #
16587次浏览 404人参与
# 烂工作和没工作哪个更痛苦? #
1816次浏览 46人参与
# 发工资后,你做的第一件事是什么 #
100316次浏览 336人参与
# AI替代不了什么? #
1703次浏览 40人参与
# 一人分享一道面试手撕题 #
114163次浏览 2878人参与
# 学历VS实习,哪个更重要? #
10389次浏览 159人参与
# 工作上你捅过哪些篓子? #
69271次浏览 334人参与
# 春招至今,你收到几个面试了? #
4298次浏览 45人参与
# 产品人求职现状 #
361433次浏览 2603人参与
# 谈薪时HR压价该怎么应对 #
294092次浏览 3361人参与
# 机械校招之路总结 #
120290次浏览 2083人参与
# 面试紧张时你会有什么表现? #
35775次浏览 243人参与
# uu们,春招你还来吗? #
69769次浏览 932人参与
# 刚工作的你,踩过哪些坑? #
33356次浏览 278人参与
# 面试中,你被问过哪些奇葩问题? #
99503次浏览 1431人参与
# 非技术投递记录 #
716842次浏览 6930人参与
# 机械人与华为的爱恨情仇 #
155255次浏览 1047人参与
# 你的实习什么时候入职 #
368229次浏览 2368人参与
# 牛友的志愿填报指南 #
63936次浏览 492人参与
