面试题 10.11. 峰与谷-贪心-Java
1.题目
2.思路
一定是要读懂题意!读懂题意!读懂题意!重要的事情说三遍。理解以下几个问题
什么是峰?
小大小。这个大的数就是峰。比如1,3,2中3就是峰。这里就是谷峰谷。
什么是谷?
大小大。这个小的数就是谷。比如3,1,2中1就是谷。这里就是峰谷峰。
什么的峰谷顺序可以作为答案?
题目中只写了按照峰谷交替输出。并没有说是否必须保证第一个是峰或者第一个是谷。所以我当时的猜测是两个都可以,后面经过代码测试确实如此。
如果是边界怎么处理?比如第一个数和最后一个数。
如果是开头或者末尾的话,其实就只需要判断一边的大小情况。比如第一个数,只需要判断和右边的大小情况。比如第一个数,如果nums[0] > nums[1] ,代表第一个数是峰值。如果nums[0] < nums[1],代表第一个数是谷值。那么相等呢?接着看。
如果相等的数字怎么办?
注意读题,等于的情况,既可以属于峰值,又可以属于谷值。也就是说第一个数的峰谷判断,假如nums[0] == nums[1], 那么这个数有可能是峰,也可以是谷。需要接下来判断第二个数是峰还是谷。
一个整数数组是不是可以有多个答案?(这里绕了好久,不确定对不对,提交完才确认)
比如第一个样例:
输入:[5, 3, 1, 2, 3]
输出:[5, 1, 3, 2, 3]
这里其实输出的是峰谷峰谷峰的顺序,按照我们上面的理解,其实还可以是以谷开头,也就是下面
输出:[3, 5, 1, 3, 2],这个也是被答案所认可的(一开始测试样例不能通过,但是最终提交是可以通过的)
所以答案可能有多个,只要满足题意就可以。
解决方法一排序+头尾拿
- 直接对数据进行一个排序,比如Arrays.sort(nums)
- 然后此时其实就形成了12345,这样类似的序列。我假如要让第一个是峰值。那么我取一个最大的值就可以。然后再取一个最小的值,这样以此类推,就可以形成峰谷峰谷峰。。。序列。
- 开辟一个新数组保存位置,最后再把新数组的值赋给nums
- 时间复杂度:O(nlogn),主要是排序的时间
- 空间复杂度:O(n),开辟了新数组
class Solution {public void wiggleSort(int[] nums) {int n = nums.length;if(n <= 2) return; //两个数以下,直接返回。int[]ans = new int[n];Arrays.sort(nums);boolean high = true; //第一个数字是峰int left = 0, right = n - 1;for(int i = 0 ; i < n ; i++){if(high){ans[i] = nums[right];right--;}else{ans[i] = nums[left];left++;}high = !high;}for(int i = 0 ; i < n ; i++){nums[i] = ans[i];}}
}
解决方法二原地修改--面试想要考察的是这个方法
其实仔细思考,根本没必要对整体数组进行排序,我们只需要挨个遍历就可以了。
在方法一中,我们是一开始默认让第一个数是峰值,也就是high = true.但是我们其实可以判断出原来得数组第一个数到底是不是峰值。直接比较第一个数和第二个数的大小关系即可。
假如nums[0] > nums[1] ,代表第一个数是峰值。下一个数字就是谷值。
假如nums[0] <= nums[1], 代表第一个数谷值。下一个数字就是峰值。
当我们遍历到第二个数字的时候,我们已经通过一个变量知道这个数字是峰值还是谷值。
比如low == true,代表此时这个数一定是谷值,那么要保证第三个数比第二个数大于等于。(如果不满足,就交换位置)
比如low == false,代表此时这个数一定是峰值,那么要保证第三个数比第二个数小于等于。((如果不满足,就交换位置))
最后记得变更下一个数low = !low。
所以这是一个贪心的思想,每次我都可以保证局部都是峰谷峰谷,最终达到一个峰谷峰谷峰谷的状态。
- 时间复杂度:O(n)
- 空间复杂度: O(1)
class Solution {public void wiggleSort(int[] nums) {int n = nums.length;if(n <= 2) return ;boolean low = true; //判断一开始是峰还是谷,low = true, 代表第一个位置是谷if(nums[0] > nums[1]) low = false; //low = false, 代表是峰for(int i = 1 ; i < n - 1 ; i++){if(low){ // 这个位置元素必须是谷if(nums[i + 1] > nums[i])swap(nums, i + 1, i);}else{ //这个位置元素必须是峰if(nums[i + 1] < nums[i])swap(nums, i + 1, i);}low = !low;}}public void swap(int[]nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}
3.结果
面试题 10.11. 峰与谷-贪心-Java相关推荐
- LeetCode——面试题 10.11. 峰与谷(JAVA)
在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, 6, 2, 3, 4, 6}中,{8, ...
- 面试题 10.11. 峰与谷
面试题 10.11. 峰与谷 [中等题][数组] 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5 ...
- 面试题 10.11. 峰与谷 ( 思维 )
LeetCode:面试题 10.11. 峰与谷 有点巧妙, 一开始弄复杂了,想着先把峰和谷存在两个 list 中, 然后再覆盖原数组, 然后发现有些样例的数中既不是峰也不是谷的( 如: nums[i− ...
- 面试题 10.11. 峰与谷-快速排序
面试题 10.11. 峰与谷-快速排序 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, ...
- 【程序员面试金典】面试题 10.11. 峰与谷
[程序员面试金典]面试题 10.11. 峰与谷 题目描述 解题思路 题目描述 描述:在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等 ...
- 程序员面试金典 - 面试题 10.11. 峰与谷
题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 在一个整数数组中,"峰& ...
- 程序员面试金典 - 面试题 10.11. 峰与谷(排序/不排序)
1. 题目 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素. 例如,在数组{5, 8, 2, 6, 3, 4, 3 ...
- 【LeetCode】面试题 10.11. 峰与谷
在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, 6, 2, 3, 4, 6}中,{8, ...
- 力扣 面试题 10.11. 峰与谷
题目 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{ ...
最新文章
- 【Python自学】万文字,学习框架+思维整理,入门就是这么简单
- Kafka High Availability (下)
- 学校APP太难用,码农爸妈们自己做出开源程序,官方却要报警
- DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)...
- 直播未来属于RTMP还是HTTP?
- Java Math类toDegrees()方法与示例
- linux 读取内存颗粒,linux查看主板内存槽与内存信息的命令dmidecode怎么用
- hibernate annotation注解方式来处理映射关系
- java基础--IO流之File类
- pptv图标出现在计算机磁盘,PPTV出现界面乱码如何解决
- linux访问samba命令,smbclient命令
- Python 蓝牙通信模块pybluez Win7
- 银行热衷拿区块链专利 背后有何意图
- 虚拟机Ubuntu复制粘贴到主机(不安装vmware-tools实现两者之间文件共享)
- 工业以太网交换机常见的几种故障类型及分析排查方法
- NFormer: robust person re-identification with neighbor transformer
- 抵制微信公众号,从我做起
- 2020云栖大会-达摩院
- 文章快速伪原创(怎么快速得到伪原创文章)
- 我的Cocos2d-x学习笔记(十一)触摸、触摸优先级
热门文章
- 什么是浮动塌陷css,css样式float造成的浮动“塌陷”问题的解决办法
- 2023年淘宝天猫年货节超级红包哪里领?
- 计算机原理-ACC 等14个指令缩写
- Nextcloud基本使用方法
- MongoDB常用查询语句
- HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码...
- 普通函数和箭头函数中的this指向
- 怒写400篇AI文章!这群妹子卷疯了…
- Ipopt输出的含义
- 【已解决】联想小新14无线图标消失 | 网络适配器有感叹号 | Windows仍在设置此设备的类配置(代码56)的解决方法