算法题--找规律(构建乘积数组、剪绳子、圆圈中最后剩下的数字)

news2024/11/19 6:37:44

目录

找规律

构建乘积数组

原题链接

解析 

核心思想

答案

剪绳子

原题链接

解析

核心思想

答案

圆圈中最后剩下的数字

原题链接

解析

核心思想

答案 


找规律

需要通过列举多个示例,从多个示例的输入到输出中得到规律去普遍化。

构建乘积数组

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]不能使用除法

示例:

输入: [1,2,3,4,5]
输出: [120,60,40,30,24]
var constructArr = function(a) {

};

原题链接

力扣

解析 

注意for循环的第一步中mul*=a[i],第一次执行循环体的时候不会执行,第二次循环前会先执行再i++。

核心思想

以示例为例构建5位数组arr每位等于i-1的累乘[1,1,2,6,24],此时最后一位即对应答案,前一位需要乘5,再前一位需要乘5*4,再前一位需要乘5*4*3,再前一位需要乘5*4*3*2。

答案

var constructArr = function(a) {
    const res = []
    for (let i = 0, mul = 1; i < a.length; mul *= a[i], i++) {
        res[i] = mul
    }
    for (let i = a.length - 1, mul = 1; i >= 0; mul *= a[i], i--) {
        res[i] = res[i] *mul
    }
    return res
};

剪绳子

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
var cuttingRope = function(n) {

};

原题链接

力扣

解析

找规律通过下图可发现规律为拆分为尽可能多的3相乘,其次为2相乘。

image.png

核心思想

方法一(找规律)

前3个为特殊的值直接返回,后面每个值大于4即减一次3并将最大值乘一次3,跳出循环后将最后剩余的值乘以最大值即可

方法二(动态规划)

首先确定动态规划的数组代表什么,res[n]表示绳长为n时剪的乘积的最大值。

然后设定初始值res[0]=res[1]=1,再找到上下层级的关系。当长度大于2时,每次剪长度为j,分为两种情况

1.(n-j)*j 此时为最大值的话不在往下拆分。

2.res[n-j]*j,剪去长度为j时继续往下剪。

由于5米绳子,剪2和剪3是一样的,所以除以2,只用循环一半,所以j从1~n/2即可

结论:res[n]=Math.max((n-j)*j,res[n-j]*j) ,j从1~n/2。

答案

方法一(找规律)

var cuttingRope = function (n) {
    if(n<=2){
        return 1
    }
    if(n===3){
        return 2
    }
    let max = 1
    while(n>4){
        max*=3
        n-=3
    }
    return max*n;
};

 方法二(动态规范)

var cuttingRope = function (n) {
    let res = new Array(n + 1)
    res[0] = 1
    res[1] = 1
    for (let i = 2; i <= n; i++) {
        let curMax = 0;
        for (let j = 1; j <= i/2; j++) {
            curMax = Math.max(curMax, Math.max(j * (i - j), j * res[i - j]));
        }
        res[i] = curMax;
    }
    return res[n];
};

圆圈中最后剩下的数字

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:

输入: n = 5, m = 3
输出: 3

示例 2:

输入: n = 10, m = 17
输出: 2
var lastRemaining = function (n, m) {

};

原题链接

力扣

解析

通过列举m为定值,n为多值的的示例,找示例结果中的规律。

f(1,3)=0

f(2,3)=1

f(3,3)=1

f(4,3)=0

f(5,3)=3

核心思想

方法一:

按题目意思设置2个序号一个用于表示当前遍历的数组位置,一个用来表示循环到第几个,循环删除数组中的元素只到数组中只剩余1个元素。

方法二:通过列举当m为定值,n为多个值的示例得到循环递归的关系

f(x,y)=(f(x-1,y)+y)%x

理解为f(x,y)删除第y位的元素后,相当于x-1个元素时向右偏移y位,例如f(5,3)删除第一位元素后从

01234=》0134,此时以3为第一位,相当于3401的四位依次删除的结果,然后由于可能大于数组所以需要%x。

答案 

 方法一:根据题意循环删除(时间复杂度过不了

var lastRemaining = function(n, m) {
    let arr = new Array(n).fill(0).map((v,i)=>i)
    let i =  0
    let j =  1
    while(arr.length!==1){
        if(m===j){
            arr.splice(index,1)
            i --
            j=0
        }
        i++
        j++
        if(i===arr.length){
            i=0
        }
    }
    return arr[0]
};

方法二:找规律递归

var lastRemaining = function (n, m) {
  if (n === 1) return 0; //只有一个数的时候那就是下标为0的地方
  return (lastRemaining(n - 1, m) + m) % n;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【黑马头条之kafka及异步通知文章上下架】

本笔记内容为黑马头条项目的kafka及异步通知文章上下架部分 目录 一、kafka概述 二、kafka安装配置 三、kafka入门 四、kafka高可用设计 1、集群 2、备份机制(Replication&#xff09; 五、kafka生产者详解 1、发送类型 2、参数详解 六、kafka消费者详解 1、消费者…

国内最大Llama开源社区发布首个预训练中文版Llama2

"7月31日&#xff0c;Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代&#xff01; | 全球最强&#xff0c;但中文短板…

Ubuntu20.04进入桌面后左上角光标闪动

T 光标闪烁就是后台一系列活动的简化&#xff0c;它表示后台有一系列活动在进行&#xff0c;只是我们看不到。也因此让我们觉得它像是卡住了。 Y 一开始误以为是由于我安装其他启动动画导致的&#xff0c;后来换回默认的动画发现不是这个原因。 后来我试了各种方法&#xff…

Android安卓实战项目(7)---购物APP(源码在文末)

Android安卓实战项目&#xff08;7&#xff09;—购物APP&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 一.项目运行介绍 【bilibili展示】 https://www.bilibili.com/video/BV1xh4y1C7o1/?share_sourcecopy_web&vd_sourceb2e9b9ed746acd…

Linux系统安装部署MongoDB完整教程(图文详解)

前言&#xff1a;本期给大家分享一下目前最新Linux系统安装部署MongoDB完整教程&#xff0c;我的服务器采用的是Centos7&#xff0c;在部署之前我重装了我的服务器&#xff0c;目的是为了干净整洁的给大家演示我是如何一步步的操作的&#xff0c;整体部署还是挺简洁&#xff0c…

Vue3基础知识(待续)

Vue是什么 构用户界面的js的渐进式框架&#xff0c;基于htlm、css、js&#xff0c;并提供声明式组件化的编程模型&#xff0c;帮你高效开发用户界面。无论简单或复杂的界面Vue都可以胜任。 vue是一个框架&#xff0c;同时也是一个生态。因为有很多程序员支持vue&#xff0c;开…

【Python】Web学习笔记_flask(4)——钩子函数

钩子函数可以用来注册在请求处理的不同阶段执行出 Flask的请求钩子指的是在执行视图函数前后执行的一些函数&#xff0c; 之前是有4种&#xff0c;但是 before_first_request已经被删除了&#xff0c;使用时会报错 before_request&#xff1a;在每次请求前执行&#xff0c;…

Arc A770M的蝰蛇峡谷迷你电脑主机值得入手吗?

相比于已经走上正轨的NUC迷你电脑产品&#xff0c;英特尔的独显&#xff0c;特别是最新一代Arc&#xff08;锐炫&#xff09;还是犹抱琵琶半遮面。通过蝰蛇峡谷NUC&#xff0c;它算是正式亮相了。 这里的Serpent Canyon是英特尔NUC系列的最新产品。它在NUC 12 Enthusiast版本中…

高级C语言

1.day1 1、mobaxterm使用 1、更方便的使用虚拟机终端&#xff1b; 2、新建一个终端&#xff0c;CTRL SHIFT U; 3、清屏&#xff0c;CTRL L; 2、gdb调试 参考《gdb调试器练习》 2.day2 3.day3 1、vin自动生成main函数 1&#xff09;打开vim的配置文件&#xff1b; s…

【开源源码学习】

C 迷你高尔夫 一款打高尔夫的游戏。亮点是碰撞反应和关卡设计。 GitHub - mgerdes/Open-Golf: A cross-platform minigolf game written in C. TypeScript 俄罗斯方块 复刻经典的俄罗斯方块&#xff0c;项目采用ReactReduxImmutable的技术栈。 GitHub - chvin/react-tetr…

【Web】基于C#的学生选课系统开发

目录 一、实验目的二、设计数据库表三、设计学生、课程和已选课程类四、 系统流程图五、功能流程图六、总结 一、实验目的 1、设计学生类&#xff08;学号 | 姓名 | 班级 | 初始密码&#xff09; 2、设计课程类&#xff08;课程代码 | 课程名称 | 学分&#xff09; 3、设计已选…

HTML5 Canvas(画布)

<canvas>标签定义图形&#xff0c;比如图表和其他图像&#xff0c;你必须用脚本来绘制图形。 在画布上&#xff08; Canvas &#xff09;画一个共红色矩形&#xff0c;渐变矩形&#xff0c;彩色矩形&#xff0c;和一些彩色文字。 什么是 Canvas&#xff1f; HTML5<c…

数据库的分库分表

#!/bin/bash ######################### #File name:db_fen.sh #Version:v1.0 #Email:admintest.com #Created time:2023-07-29 09:18:52 #Description: ########################## MySQL连接信息 db_user"root" db_password"RedHat123" db_cmd"-u${…

linux安装Tomcat及部署jpress的详细教程!!!

一、YUM在线安装 1、查看Tomcat相关安装包 [rootlocalhost ~]# yum list | grep tomcat tomcat.noarch 7.0.76-16.el7_9 updates tomcat-admin-webapps.noarch 7.0.76-16.el7_9 updates tomcat-docs…

msvcr100.dll丢失的解决方法?三招解决msvcr100.dll丢失问题

最近我遇到了一个电脑问题&#xff0c;就是在运行某个软件时提示缺少msvcr100.dll文件。起初我并不知道这个文件是什么&#xff0c;也不知道它的作用&#xff0c;但通过一番搜索和了解&#xff0c;我对这个问题有了更深的理解&#xff0c;并且也得到了解决的办法。 解决方法一&…

分享学习java过程中遇到的一些网址

*****JavaWeb视频教程***** https://www.bilibili.com/video/BV1m84y1w7Tb?p4&spm_id_frompageDriver&vd_source841fee104972680a6cac4dbdbf144b50*****Java前端官网教程&#xff08;HTML、CSS、JS)***** https://www.w3school.com.cn/html/index.asp*****VS Code官网…

阶段性实验汇总

文章目录 前言一、实验目的与要求1.目的2.要求 二、实验拓扑三、实验步骤1.阅读实验拓扑2.配置基础环境3.配置DHCP及其中继服务器&#xff08;一&#xff09;DHCP主服务器&#xff08;二&#xff09;DHCP中继服务器(三)登录客户端验证 4.配置DNS服务器&#xff08;一&#xff0…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

RS232转Profinet网关rs232转网口需要如何设置

大家好&#xff0c;今天我要给大家带来一个很有意思的案例分享。你们猜猜&#xff0c;这回我们要用捷米的一款神奇的网关JM-RS485/232-PN做什么呢&#xff1f;没错&#xff0c;我们要把一台扫码枪设备通过这个RS232转PROFINET网关&#xff0c;接入到一台西门子S7-1200PLC的Prof…

无涯教程-Lua - for语句函数

for 循环是一种重复控制结构&#xff0c;可让您有效地编写需要执行特定次数的循环。 for loop - 语法 Lua编程语言中 for 循环的语法如下- for init,max/min value, increment dostatement(s) end 这是 for 循环中的控制流程- 首先执行 init 步骤&#xff0c;并且仅执行一…