摇摆序列

摘要:
少于两个元素的序列也是摆动序列。给定一个整数序列,返回作为摆动序列的最长子序列的长度。

1、题目来源:选自LeetCode 376:摆动序列

2、题目描述:

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如,[1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3)是正负交替出现的。相反, [1,4,7,2,5][1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

摇摆序列第1张

3、题目分析:

摇摆子序列的定义可以看出,这些点如果在坐标中表示出来的话,形成的形状是一个折线,而且没经过一个点折线都会改变上升或者下降的趋势,如果序列中有一段连续的上升或者连续的下降的情况,则我们利用贪心算法去折线的首位元素,这样更加有可能使尾部后面的那一个元素成为摇摆子序列的下一个元素。

摇摆序列第2张

4、代码实现:

1 public int wiggleMaxLength(int[] nums) {
2         //进行特殊情况下的边界检测
3         if(nums.length<2){
4             returnnums.length;
5 }
6         //定义三个状态值
7         final int BEGIN = 0;
8         final int UP = 1;
9         final int DOWN = 2;
10         int START =BEGIN;
11         int Max_len = 1;
12         /**
13 * 循环遍历整个数组,根据每个元素和前一个元素的大小关系确定状态值,并根据状态值决
14 * 定最长子序列的长度是否增加。
15          */
16         
17         for (int i = 1; i < nums.length; i++) {
18             switch(START) {
19             //开始时刻比较当前元素和前一个元素的大小关系,然后确定状态值是上升还是下降
20             caseBEGIN:
21                 //若前一个元素较小,则是上升状态,将状态值改为上升UP
22                 if (nums[i - 1] <nums[i]) {
23                     START =UP;
24                     Max_len++;
25                 //若前一个元素较大,则是下降状态,将状态值改为下降DOWN    
26                 } else if (nums[i - 1] >nums[i]) {
27                     START =DOWN;
28                     Max_len++;
29 }
30                 break;
31             
32             /**
33 * 若当前状态已经是上升状态,那么下一个元素只能是下降状态的时候符合摇摆序列
34 * 的定义,其他情况都是不满足摇摆序列的定义的情况
35              */
36             caseUP:
37                 if (nums[i - 1] >nums[i]) {
38                     START =DOWN;
39                     Max_len++;
40 }
41                 break;
42                 
43                 /**
44 * 若当前状态已经是下降状态,那么下一个元素只能是上升状态的时候符合摇摆
45 * 序列的定义,其他情况都是不满足摇摆序列的定义的情况
46                  */
47             caseDOWN:
48                 if (nums[i - 1] <nums[i]) {
49                     START =UP;
50                     Max_len++;
51 }
52                 break;
53 }
54 }
55 
56         returnMax_len;
57     }

5、提交运行:

摇摆序列第3张

免责声明:文章转载自《摇摆序列》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇GPU微观物理结构框架PythonWeb 服务部署文档及迁移到Linux相关下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

webpack打包(1)

Webpack可以处理js/json资源。生成环境比开发环境具有更多的功能来压缩代码。它可以将ES6模块化为浏览器在webpack.config中识别的模块操作命令npmiwebpackwebpack-cli-g npminit npmiwebpack-cli-D配置并运行webpack以将webpack.config.js文件打包...

微信扫码网页登录,redirect_uri参数错误解决方法

对于微信开放平台[管理中心/应用程序详细信息]中设置的[开发信息][授权回调域],只需填写域名,无需https://,也无需特定页面。您不需要填写完整的请求路径,如图所示:https://open.weixin.qq.com/connect/qrconnect?appid=您的APPID&direct_Uri=回调和响应的特定地址_type=code...

iOS开发(Swift):创建UINavigationView的三种方法

,表示window值我们会赋值。然后创建一个根视图控制器rootViewController,一个导航控制器navigationController。)-˃Bool{//Overridepointforcustomizationafterapplicationlaunch.window=UIWindowwindow.makeKeyAndVisible()ro...

微信小程序----返回上一页刷新或当前页刷新

1.Reload()方法刷新当前页面;2.replace()方法刷新当前页面;3.页面自动刷新当前页面;实现js刷新当前页面的三种方法使用微信小程序--返回上一页刷新或当前页面刷新1.在实现效果之前,您需要了解微信小应用程序的页面生命周期。如果你不太清楚,你可以看到微信小程序——页面生命周期;2.我们可以知道微信小程序页面由五个循环组成:onLoad、onR...

IOS崩溃日志解析(crash log)

IOS的应用程序少不了crash,互联网统计分析工具友盟有一项目错误分析的功能,专门用于应用程序崩溃日志统计,最近研究友盟上统计到的崩溃日志,在此对崩溃日志做一个简单的总结。否则,应用将被iOS终止,并产生低内存崩溃报告。这样,我们去我们的dSYM文件看看我们的UUID是否和崩溃日志上的UUID一致,只有dSYM文件的UUID和崩溃日志上的UUID一致,我们...

浅谈 SQL 注入(注入篇)

1、 SQL注入1.1简介什么是SQL注入?它不过滤用户可以严格控制或没有限制的参数,以便用户可以将传入的参数和SQL语句组合成SQL语句,然后将其传输到web服务器。最后,它被传输到数据库以执行添加、删除、修改和查询等操作。基于此,用户可以获取数据库数据或提高其销毁数据库数据的权限。...