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

目录

找规律

构建乘积数组

原题链接

解析 

核心思想

答案

剪绳子

原题链接

解析

核心思想

答案

圆圈中最后剩下的数字

原题链接

解析

核心思想

答案 


找规律

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

构建乘积数组

给定一个数组 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 = 1while(n>4){max*=3n-=3}return max*n;
};

 方法二(动态规范)

var cuttingRope = function (n) {let res = new Array(n + 1)res[0] = 1res[1] = 1for (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 =  0let j =  1while(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.mzph.cn/news/19331.shtml

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

相关文章

【娱乐圈明星知识图谱2】信息抽取

目录 1. 项目介绍 2. 信息抽取介绍 3. ChatGPT 信息抽取代码实战 4. 信息抽取主逻辑 5. 项目源码 1. 项目介绍 利用爬虫项目中爬取的大量信息 【娱乐圈明星知识图谱1】百科爬虫_Encarta1993的博客-CSDN博客娱乐圈明星知识图谱百度百科爬虫百度百科爬虫百度百科爬虫百度百…

Ansible的脚本——playbook剧本

Ansible的脚本——playbook剧本 一、Ansible playbook简介1、playbook格式2、playbook组成部分 二、示例三、Templates模块四、tags模块五、Roles模块 一、Ansible playbook简介 playbooks是 一个不同于使用Ansible命令行执行方式的模式&#xff0c;其功能更强大灵活。简单来说…

redisson分布式锁学习

什么是分布式锁? 当有多个线程并发访问同一共享数据时,如果多个线程同时都去修改这个共享数据,且修改操作不是原子操作,就很有可能出现线程安全问题&#xff0c;而产生线程安全问题的根本原因是缺乏对共享数据访问的同步和互斥。 为了解决这个问题&#xff0c;通常我们的做法…

Rust: error: failed to run custom build command for `openssl-sys v0.9.71`

error: failed to run custom build command for openssl-sys v0.9.71 解决 windows &#xff1a; openssl 不要选Light版 设置环境变量 cmd: set OPENSSL_DIR“C:\Program Files\OpenSSL-Win64” OPENSSL_DIR&#xff1a;C:\Program Files\OpenSSL-Win64 linux&#xff1a…

java基础四-String/StringBuffer/StringBuilder区别

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象&#xff0c;每次操作都会生成新的 String 对象&#xff0c;然后将指针指向新的 String 对象&#xff0c;而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作&#xff0c;所以在经常…

【Golang 接口自动化07】struct转map的三种方式

目录 背景 struct转map 使用json模块 使用reflect模块 使用第三方库 测试 总结 资料获取方法 背景 我们在前面介绍过怎么使用net/http发送json或者map数据&#xff0c;那么它能不能直接发送结构体数据呢&#xff1f;我们今天一起来学习结构体struct转map的三种方法&am…

PHM的设备故障模型如何构建?

预测性维护与健康管理&#xff08;Prognostics Health Management&#xff0c;PHM&#xff09;是现代工业中的一个关键概念&#xff0c;它旨在通过使用数据和先进的分析技术&#xff0c;实现设备故障的早期预测和预防&#xff0c;从而最大限度地提高设备的可用性和可靠性。而在…

MySQL(一)

mysql简介 1、什么是数据库 &#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它产生于距今六十多年前&#xff0c;随着信息技术和市场的发展&#xff0c;特别是二十世纪九十年代以后&#xff0c;数据管理不再仅仅…

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…

行为型模式之解释器模式

解释器模式&#xff08;Interpreter Pattern&#xff09; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于对语言的文法进行解释和解析&#xff0c;以实现特定的操作。 在解释器模式中&#xff0c;存在以下几个角色&#xff1a; 抽…

如何动态改变background-image

动态改变background-image 最近在开发uni-app小程序时尝试使用栅格布局利用u-grid-item循环遍历元素节点&#xff0c;其中每个元素节点对应的背景图片都不相同&#xff0c;于是就遇到了需要动态改变元素background-image的操作。 错误写法 如果单纯的使用常规的eslint写法。…

uniapp 长时间不操作,自动退出登录页

store 下的inex.js文件 import Vue from vue import Vuex from vuexVue.use(Vuex)const store new Vuex.Store({state: {// 记录最后一次点击时间的元素lastTime: new Date().getTime(),},mutations: {//点击事件调用&#xff0c;刷新最后一次点击时间lastTimeUpdata: (state…

大牛练成记:用JavaScript徒手写出一个日期选择插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;100个JavaScript的小应用。 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收…

【C语言】初识指针

【C语言】初识指针 一、指针是什么&#xff1f;二、指针和指针类型1. 指针-整数2. 指针的解引用三、野指针1.野指针成因2 .如何规避野指针四、指针运算五、二级指针七、指针数组 &#x1f388;个人主页&#xff1a;库库的里昂&#x1f390;CSDN新晋作者&#x1f389;欢迎 &…

ansible安装及rhel8仓库配置

目录 一、本地仓库 问题&#xff1a; 解决&#xff1a; 1.创建一个仓库&#xff1a; 内容&#xff1a; 2.挂载&#xff1a; 挂载&#xff1a; 测试&#xff1a; 3.或者直接使用阿里云的源 二.配置ansible仓库 1.下载&#xff1a; 2.检查 一、本地仓库 问题&#xff1a; 当…

R并行计算-parallel例子1

前言&#xff1a; 通常&#xff0c;如果进程运行时间超过3分钟&#xff0c;则会考虑使用并行处理。 这听起来可能很复杂&#xff0c;但是并行计算很简单。 当你有一个重复的任务&#xff0c;它占用了你太多宝贵的时间&#xff0c;为什么不使用并行计算来节省时间呢&#xff…

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…

docker快速入门

文章目录 简介&#xff1a;组成&#xff1a;安装&#xff1a;运行&#xff1a;原理&#xff1a;常用命令&#xff1a;1.帮助启动类命令2.镜像命令3.容器命令4.命令交互图5.将镜像打包发布到阿里云1.将本地容器制作为镜像2.登录阿里云3.创建个人实例4.创建镜像仓库5.将镜像推送到…

马上解锁 StarRocks 存算分离,降本增效无需等!

StarRocks 于 4 月底正式发布了 3.0 版本&#xff0c;该里程碑版本带来了大家期盼已久的新特性--存算分离。此新功能一推出&#xff0c;立即受到社区热情追捧&#xff0c;用户纷纷开始在自己的业务中评估和测试存算分离效果。从芒果TV、聚水潭、网易邮箱、浪潮、天道金科等数十…

【VScode】Remote-SSH XHR failed无法访问远程服务器

问题概述 当使用VScode连接远程服务器时&#xff0c;往往需要使用Remote-SSH这个插件。而该插件有一个小bug&#xff0c;当远程服务器网络不佳时容易出现。 在控制台会出现下述语句&#xff1a; Resolver error: Error: XHR failed at y.onerror (vscode-file://vscode-app/…