当前位置: 首页 > news >正文

制作网站的软件有那个免费东莞网站建设规范

制作网站的软件有那个免费,东莞网站建设规范,wordpress无限加载,网站转为移动网站题目 文件组合 待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组…

题目

文件组合

待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组合列表。

注意,返回时需遵循以下规则:

每种组合按照文件编号 升序 排列; 不同组合按照第一个文件编号 升序 排列。

示例 1:

输入:target = 12 输出:[[3, 4, 5]] 解释:在上述示例中,存在一个连续正整数序列的和为 12,为 [3, 4, 5]。
示例 2:

输入:target = 18 输出:[[3,4,5,6],[5,6,7]] 解释:在上述示例中,存在两个连续正整数序列的和分别为18,分别为 [3, 4, 5, 6] 和 [5, 6, 7]。

提示:

1 <= target <= 10^5

解法1:分类

  1. 这种做法是笔者最朴素的想法:如果遍历小于 target 的每一个数,逐个相加尝试该数是否能组成一个符合条件的文件序列,那时间复杂度太高了(其实这种就是滑动窗口的思想,复杂度只有O(N))。于是我想能否在遍历到这个数的同时,直接根据这个数与 target 之间的某种关系判断其能否形成合适的序列,于是在观察到文件序列其实是等差数列后,我决定依据等差数列的特点对其进行分类
  2. 使用 i 进行遍历。文件序列如果有奇数个元素,则可以找到等差中项,target 能整除 in = target / i 必须为奇数
  3. 文件序列如果有偶数个元素,则target 能整除 i + i+1n 和 target 的奇偶必须相同(!((n+target)%2))(因为n 表示有n对i + i+1,而i + i+1必为奇数,所以当n为偶数的时候,n对i + i+1的和为偶数;n为奇数的时候,n对i + i+1的和为奇数。所以 n 和 target 的奇偶必须相同)
  4. 由于题目要求不同组合按照第一个文件编号 升序 排列,而当我遍历 i 时,无法确定由 i 作为靠中间的元素的这个序列的头部是多少,所以我使用了 map 存储,利用了 map 会自动排序 key 的特点(结构:map<第一个文件编号,文件编号序列的 vector>)
class Solution {
public:vector<vector<int>> fileCombination(int target) {vector<vector<int>> all;map<int, vector<int>> forOrder;for(int i=1; i<=(target+1)/2; ++i){if(!(target%i)){//target 能整除 i,则可能的组合有奇数个元素int n = target / i;if(n%2 && i>n/2){//n 为组合中元素的个数,必须为奇数vector<int> group;for(int j=i-n/2; j<=i+n/2; ++j){group.push_back(j);}forOrder[i-n/2] = group;}}if(!(target%(i + i+1))){//target 能整除 i + i+1,可能的组合必为偶数个元素int n = target/(i + i+1);if(!((n+target)%2) && i-(n-1)>0){//n 和 target 的奇偶必须相同vector<int> group;for(int j=i-(n-1); j<=(i+1)+(n-1); ++j){group.push_back(j);}forOrder[i-(n-1)] = group;}}}// 将 forOrder 中的元素按顺序存入 all 中for (const auto& pair : forOrder) {all.push_back(pair.second);}return all;}
};

解法2:滑动窗口(双指针)

  1. 这种想法也很简单,从 i=1 开始,计算其后连续的序列的和,如果和小于 target,那么就在和的基础上往后再加一个数字;如果和大于 target 了,则表明此时的 i 作为开始元素找不到合适的序列,此时 i 往后移动,并记得让和减去上一个 i
  2. 这种想法虽然是遍历求和,并比较和与目标值,但是时间复杂度并不高,这是因为每次遍历和的计算都是在上一轮和的计算结果上进行的
  3. 由于是从 i=1 开始遍历,逐渐求和比较,故不存在有的序列会遍历不到的问题
//滑动窗口vector<vector<int>> fileCombination(int target) {vector<vector<int>> all;int i=1, j=2, sum=i+j;while(i<j){if(sum == target){vector<int> group;for(int k=i; k<=j; ++k){group.push_back(k);}all.push_back(group);}if(sum < target){++j;sum += j;// cout<<"j:"<<j<<"sum"<<sum<<endl;} else{sum -= i;++i;}}return all;}

解法3:等比数列求和公式求解

  1. 知道序列和 target,知道首项 i,那么可以利用等差数列求和公式 + 二次方程求根公式求出末项 j,遍历 i 找到所有符合的末项 j 即可。由于是使用公式计算,时间复杂度并不高
  2. 当 j 为整数时,符合条件,此处的判断方法为:if(j == (int)j)
  3. c++ 中,有int i,当 ii 结果超过int时,需要写成(long)ii,表达式 ii 的结果会首先根据表达式中操作数的类型来决定。如果 i 是整型(int),那么表达式 ii 也会被视为整型运算。
    在这里插入图片描述
//等差求和公式做法vector<vector<int>> fileCombination(int target) {vector<vector<int>> all;for(int i=1; i<(target+1)/2; ++i){double j = (-1+sqrt(1+4*(2*target+(long)i*i-i)))/2.0;if(j == (int)j){vector<int> group;for(int k=i; k<=(int)j; ++k){group.push_back(k);}all.push_back(group);}}return all;}
http://www.yayakq.cn/news/875181/

相关文章:

  • 淄博学校网站建设公司优秀网络小说推荐
  • 建设 网站协议范本哪个网站可以做信用社的题
  • 在哪个网站可以自助建站宽带开户多少钱
  • 电商网站有哪些功能模块wordpress修改他人的模板
  • 青岛房产网上查询台州网站建设seo
  • 网站开发有哪些要求唐山网站建设方案咨询
  • 外贸在哪个网站做中国国家住房和城乡建设部网站首页
  • 个人域名备案需要多久东莞seo网络服务公司
  • 南宁网站开发外包报价长沙网络营销咨询费用
  • 电子政务网站建设的步骤一般为定制软件系统
  • 南昌网站建设优化推广费用网站商城与网站区别吗
  • 怎么做网站免费北京舞美设计制作公司
  • 深圳制作网站的公司网站域名更改
  • 三站合一网站建设网站关键词优化价格
  • 怎么做微商网站一键关键词优化
  • 淮安软件园哪家做网站婚纱摄影网站模板之家
  • 成都58手机微信网站建设名录设计分享网站
  • 可以做试卷的网站英语小红书小程序入口
  • 明星百度指数在线查询西安做网站优化
  • 网站关键词如何部署图片的制作方法
  • 做枪版电影网站赚钱wordpress淘客插件破解
  • 怎么看网站创建者是谁ps网页设计实验报告
  • 外卖网站怎么做宿迁seo
  • 清远企业网站建设微信朋友圈营销方案
  • 洛阳有哪些做网站的公司免费咨询劳动仲裁
  • google adsense合肥百度seo代理
  • 廊坊网站制作费用百度推广助手怎么用
  • c2c商城网站建设二次开发邢台市教育局
  • 网站友情链接的作用wordpress版块
  • 网上商城网站建设解决方案网站后台无法更