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相关推荐

  1. LeetCode——面试题 10.11. 峰与谷(JAVA)

    在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, 6, 2, 3, 4, 6}中,{8, ...

  2. 面试题 10.11. 峰与谷

    面试题 10.11. 峰与谷 [中等题][数组] 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5 ...

  3. 面试题 10.11. 峰与谷 ( 思维 )

    LeetCode:面试题 10.11. 峰与谷 有点巧妙, 一开始弄复杂了,想着先把峰和谷存在两个 list 中, 然后再覆盖原数组, 然后发现有些样例的数中既不是峰也不是谷的( 如: nums[i− ...

  4. 面试题 10.11. 峰与谷-快速排序

    面试题 10.11. 峰与谷-快速排序 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, ...

  5. 【程序员面试金典】面试题 10.11. 峰与谷

    [程序员面试金典]面试题 10.11. 峰与谷 题目描述 解题思路 题目描述 描述:在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等 ...

  6. 程序员面试金典 - 面试题 10.11. 峰与谷

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 在一个整数数组中,"峰& ...

  7. 程序员面试金典 - 面试题 10.11. 峰与谷(排序/不排序)

    1. 题目 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素. 例如,在数组{5, 8, 2, 6, 3, 4, 3 ...

  8. 【LeetCode】面试题 10.11. 峰与谷

    在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, 6, 2, 3, 4, 6}中,{8, ...

  9. 力扣 面试题 10.11. 峰与谷

    题目 在一个整数数组中,"峰"是大于或等于相邻整数的元素,相应地,"谷"是小于或等于相邻整数的元素.例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{ ...

最新文章

  1. 【Python自学】万文字,学习框架+思维整理,入门就是这么简单
  2. Kafka High Availability (下)
  3. 学校APP太难用,码农爸妈们自己做出开源程序,官方却要报警
  4. DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)...
  5. 直播未来属于RTMP还是HTTP?
  6. Java Math类toDegrees()方法与示例
  7. linux 读取内存颗粒,linux查看主板内存槽与内存信息的命令dmidecode怎么用
  8. hibernate annotation注解方式来处理映射关系
  9. java基础--IO流之File类
  10. pptv图标出现在计算机磁盘,PPTV出现界面乱码如何解决
  11. linux访问samba命令,smbclient命令
  12. Python 蓝牙通信模块pybluez Win7
  13. 银行热衷拿区块链专利 背后有何意图
  14. 虚拟机Ubuntu复制粘贴到主机(不安装vmware-tools实现两者之间文件共享)
  15. 工业以太网交换机常见的几种故障类型及分析排查方法
  16. NFormer: robust person re-identification with neighbor transformer
  17. 抵制微信公众号,从我做起
  18. 2020云栖大会-达摩院
  19. 文章快速伪原创(怎么快速得到伪原创文章)
  20. 我的Cocos2d-x学习笔记(十一)触摸、触摸优先级

热门文章

  1. 什么是浮动塌陷css,css样式float造成的浮动“塌陷”问题的解决办法
  2. 2023年淘宝天猫年货节超级红包哪里领?
  3. 计算机原理-ACC 等14个指令缩写
  4. Nextcloud基本使用方法
  5. MongoDB常用查询语句
  6. HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码...
  7. 普通函数和箭头函数中的this指向
  8. 怒写400篇AI文章!这群妹子卷疯了…
  9. Ipopt输出的含义
  10. 【已解决】联想小新14无线图标消失 | 网络适配器有感叹号 | Windows仍在设置此设备的类配置(代码56)的解决方法