从零学算法(LCR 180)

这篇具有很好参考价值的文章主要介绍了从零学算法(LCR 180)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文件组合.待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 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]。文章来源地址https://www.toymoban.com/news/detail-726985.html

  • 他人解法1:连续整数和等于某个数,我们知道连续和 i~j 的公式为平均值(首尾相加除以2)乘以元素个数(j-i+1)
    从零学算法(LCR 180),算法学习,# 数学基础,算法
  • target 是确定的,那么只要我们让 i 从 1 开始往后找就能找到一堆 j,只要 j 为整数就说明我们找到了一种组合,直到 i >= j 我们就停止寻找,把公式经过移项能得到关于 j 的一元二次方程,然后求解就能得到 j 的公式
    从零学算法(LCR 180),算法学习,# 数学基础,算法
  • j 不可能为负数,所以只要那个 (-1 + 根号xx) / 2 就可以了
  •   public int[][] fileCombination(int target) {
          int i = 1;
          double j = 2.0;
          List<int[]> list = new ArrayList<>();
          while(i < j){
              j = (-1 + Math.sqrt(1 + 4 * (2 * target + (long) i * i - i))) / 2;
              // j 为整数
              if (j == (int)j){
                  int[] ans = new int[(int)j-i+1];
                  for(int k=i;k<=j;k++){
                      ans[k-i] = k;
                  }
                  list.add(ans);
              }
              i++;
          }
          return list.toArray(new int[0][]);
      }
    
  • 他人题解2:滑动窗口,我们初始化双指针 i,j 为 1, 2,此时连续和 s 为 3,我们比较 s 和 target,如果小了,那就得补上,我们就把 j 往后移成 3,s 更新为 1+2+3=6,而如果大了,那就得减少和,就把 i 往右移去掉一个最小的值,即 s 更新为 2,i 更新为 2。比如 target 为 9,我们一开始只有 3,就需要补充更多数字,右边界 j 右移则相当于扩充连续和范围,从 1~2 扩充为 1~3,此时和 s 为 6;下一轮比较发现还是不够,继续扩充为 1~4 ,s 为 10 了;再比较,这次太大了,我们右移 i 则相当于缩小连续和范围,从 1~4 缩小至 2~4,此时和为 9,那么我们就把此时的 2~4 作为一种组合存入结果列表,等于的时候,你扩充或缩小都无所谓,反正 i 和 j 都是一步一步移动,移动一次判断一次,所以不会遗漏某种情况。不断移动的过程中,由于后来 j 越来越大,所以 i 怎么右移(缩小范围)最后连续和 s 都大于 target,就会使得 i == j,此时退出循环即可,而比如 i~j 为 4~5 时,此时是一种可行组合, s == target,其实缩到这种只有两个数的地步,不可能再有其他组合了,虽然可以选择扩充和缩小,不过选择缩小就能直接结束循环了,扩充还得多判断几轮无意义的循环,所以我们在 s == target 时选择缩小
  •   public int[][] fileCombination(int target) {
          int i = 1,j = 2, s = 3;
          List<int[]> list = new ArrayList<>();
          while(i < j){
              if (s == target){
                  int[] ans = new int[(int)j-i+1];
                  for(int k=i;k<=j;k++){
                      ans[k-i] = k;
                  }
                  list.add(ans);
              }
              if(s >= target){
              	// 比如原本 i,j 为 2,4,s = 2+3+4 = 9,此时减掉 i 就相当于 s 成了 3+4 = 7
                  s-=i;
                  i++;
              }else{
                  j++;
                  s+=j;
              }
          }
          return list.toArray(new int[0][]);
      }
    

到了这里,关于从零学算法(LCR 180)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习的数学基础(上)

    []{#_Toc405731550 .anchor} 目录 机器学习的数学基础 1 高等数学 1 线性代数 9 概率论和数理统计 19 高等数学 1.导数定义: 导数和微分的概念 f ′ ( x 0 ) = lim ⁡ Δ x → 0   f ( x 0 + Δ x ) − f ( x 0 ) Δx f\\\'(x_{0}) = lim_{Delta x rightarrow 0},frac{f(x_{0} + Delta x) - f(x_{0})}{text{Δx}} f ′ ( x 0 ​

    2023年04月26日
    浏览(41)
  • 零基础学习数学建模——(一)什么是数学建模

    本篇博客将详细介绍什么是数学建模。 ​ 本人在本科阶段获得过国赛省一、mathorcup数学建模一等奖、五一杯数学建模一等奖、华数杯数学建模一等奖、亚太杯数学建模一等奖和两次美赛一等奖。自己在数学建模这条路上摸爬滚打了几年,现在想借助博客分享自己在数学建模

    2024年01月25日
    浏览(59)
  • 线性代数 | 机器学习数学基础

    前言 线性代数 (linear algebra)是关于向量空间和线性映射的一个数学分支。它包括对线、面和子空间的研究,同时也涉及到所有的向量空间的一般性质。 本文主要介绍 机器学习 中所用到的线性代数 核心基础概念 ,供读者学习阶段查漏补缺或是 快速学习参考 。 线性代数

    2024年01月21日
    浏览(69)
  • 强化学习的数学基础:从动态规划到深度学习

    强化学习(Reinforcement Learning, RL)是一种人工智能技术,它旨在让智能体(agent)在环境(environment)中学习如何做出最佳决策,以最大化累积奖励(cumulative reward)。强化学习的核心思想是通过在环境中与智能体与环境的交互来学习,而不是通过传统的监督学习(supervised le

    2024年02月01日
    浏览(49)
  • 机器学习——支持向量机(数学基础推导篇【未完】)

    在一个周日下午,夏天的雨稀里哗啦地下着 我躺在床上,捧着ipad看支持向量机 睡了好几个觉…支持向量机太好睡了 拉格朗日乘数法太好睡了 几何函数太好睡了 在我看来,支持向量机是目前学下来,最难以理解的内容 希望日后不要太难…脑子不支持的 支持向量积的原理,

    2024年02月12日
    浏览(95)
  • 【深度学习】S2 数学基础 P6 概率论

    机器学习本质上,就是做出预测。而概率论提供了一种量化和表达不确定性水平的方法,可以帮助我们量化对某个结果的确定性程度。 在一个简单的图像分类任务中; 如果我们非常确定图像中的对象是一只猫,那么我们可以说标签为 “猫” 的概率是 1,即 P ( y = “猫” )

    2024年02月20日
    浏览(41)
  • 算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

    互质就是两个数的最大公因数只有1,体现到代码里面就是 a和b互质,则b mod a = 1 mod a (目前我不是很理解,但是可以这样理解:a和b的最大公因数是1,即1作为除数和b作为除数时,对于被除数a来说余数是一样的,即1/a的余数和b/a是一样的,即 b mod a = 1 mod a ) 欧拉函数的作用是

    2024年02月09日
    浏览(45)
  • 一、机器学习前的数学基础知识

    你说春天太短 还未来得及看见自己 就要粉碎成灯红酒绿的夏 那就开花呀 开他妈的 1.1 求和 假设现在我们要在纸上写下1加到100的简单求和运算: 1 + 2 +3 + 4 + 5 + ........ + 99 + 100 使用求和符号简化(读作“西格玛”): 对于不明确要加到多少的情况:  对集合使用求和符号:

    2024年02月16日
    浏览(64)
  • 机器学习的数学基础:从线性代数到梯度下降

    机器学习是人工智能的一个重要分支,它涉及到计算机程序自动化地学习或者预测事物的行为。机器学习的核心是算法,算法需要数学来支持。在本文中,我们将从线性代数到梯度下降的数学基础来讨论机器学习算法的核心。 机器学习的数学基础包括线性代数、微积分、概率

    2024年02月21日
    浏览(48)
  • 深度学习的数学基础:从线性代数到随机过程

    深度学习是人工智能领域的一个重要分支,它主要通过模拟人类大脑中的神经网络来进行数据处理和学习。深度学习的核心技术是神经网络,神经网络由多个节点组成,这些节点之间有权重和偏置的连接。通过对这些节点进行训练,我们可以使神经网络具有学习和推理的能力

    2024年03月18日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包