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

java数据结构与算法刷题-----LeetCode667. 优美的排列 II

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 题目要求我们返回一个数组长度为n的数组,必须含有1~n的所有数,并且从左到右,相邻的元素依次相减,它们的差,必须有k个不同的。比如1,2,3,4,5 这5个数两两相减,都只有一个差----1.如果想要两个不同的差,就不能这么摆。可以这样1,2,3,5,4 这样就有2-1 = 1. 5-3 = 2这样两个不同的差。
  2. 而且我们发现,想要有k个不同的差,必须至少有k+1个数才能完成。大家可以尝试1~5这5个数都只能用一次,然后组出相邻相减情况下的6个不同的差,是不行的。
  3. 最简单的做法就是,用最后一个-最前面的,然后依次缩小范围(用过的不再使用),再次用后面的-前面的。直到达到目标要求的数量
  4. 那么如果要求k个不同的差,给我们n个数(n>=k+1). 我们只需要k+1个数就可以组成k个不同的差,也就是说,有n-k-1个数,我们用不到,直接放入数组即可。剩下的依次用两边的组成不同的差。具体看下面图解:
    在这里插入图片描述
  5. 极端一点的例子
    在这里插入图片描述
代码:时间复杂度O(n) 空间复杂度O(1)

在这里插入图片描述

class Solution {public int[] constructArray(int n, int k) {int[] arr = new int[n];//题目要求的返回数组int index = 0;//数组下标//前面n-k-1个数,我们不需要用来组成差for(int i = 1;i<n-k;i++){arr[index++] = i;}//剩下k+1个数,是我们需要组成k个差的数//每次从两边各取一个for(int i = n - k, j = n; i<=j; i++,j--){arr[index++] = i;//左边取一个//如果是奇数个,最后只会剩下一个数,那么左边和右边都指向同一个元素//上面左边已经放了。右边再放一次就下标越界了。所以需要if(i!=j)这个判断if(i!=j) arr[index++] = j;//右边取一个}return arr;//返回答案数组}
}
http://www.lryc.cn/news/286148.html

相关文章:

  • win10 20h2 defender添加排除项失败怎么回事 Window Defender添加不了排除项如何处理
  • mysql生成最近24小时整点时间临时表
  • 基于PHP反序列化练习
  • ITSS、ITIL、ISO20000:哪个更适合你?
  • Linux配置yum源以及基本yum指令
  • 【AI视野·今日Robot 机器人论文速览 第七十五期】Thu, 11 Jan 2024
  • 阿里云ECS(CentOS镜像)安装docker
  • 服务器工作环境要求
  • 大数据开发之Spark(入门)
  • 【GoLang入门教程】Go语言工程结构详述
  • FPGA之分布式RAM(2)
  • 纯c实现栈和队列 数据结构大全
  • 测试开发基础 | 计算机网络篇(二):物理层与数据链路层
  • 【深度学习】BasicSR训练过程记录,如何使用BasicSR训练GAN
  • 喜讯 | 华院计算摘得“2023大数据产业年度创新技术突破”奖
  • stm32高级定时器死区时间
  • Python项目——久坐提醒定时器(PySide6)编写
  • Linux,常见的强制退出/结束命令(ctr+c/ctr+d/:q/exit)
  • 检查一个Java List是否包含某个JavaBean对象的特定值,并且获取这个值
  • 浮点数详解
  • LED流水灯
  • MySQL-B-tree和B+tree区别
  • 架构篇08:架构设计三原则
  • 基于SpringBoot Vue汽车租赁系统
  • idea带的maven在SpringBoot下载jar包出错、下载jar包速度慢
  • datasets的一些使用技巧
  • react 实现页面状态缓存(keep-alive)
  • spring和springboot、springMVC有什么区别?
  • centos 启动nacos pg版本
  • 实验:MySQL 客户端SocketTimeout 抓包分析