-
Notifications
You must be signed in to change notification settings - Fork 0
/
376.go
61 lines (51 loc) · 1.52 KB
/
376.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package p376
/**
A sequence of numbers is called a wiggle sequence if the differences
between successive numbers strictly alternate between positive and negative.
The first difference (if one exists) may be either positive or negative.
A sequence with fewer than two elements is trivially a wiggle sequence.
For example, [1,7,4,9,2,5] is a wiggle sequence because the differences
(6,-3,5,-7,3) are alternately positive and negative.
In contrast, [1,4,7,2,5] and [1,7,4,5,5] are not wiggle sequences,
the first because its first two differences are positive and
the second because its last difference is zero.
Given a sequence of integers, return the length of the longest subsequence that is a wiggle sequence.
A subsequence is obtained by deleting some number of elements (eventually, also zero)
from the original sequence, leaving the remaining elements in their original order.
Examples:
Input: [1,7,4,9,2,5]
Output: 6
The entire sequence is a wiggle sequence.
Input: [1,17,5,10,13,15,10,5,16,8]
Output: 7
There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
Input: [1,2,3,4,5,6,7,8,9]
Output: 2
Follow up:
Can you do it in O(n) time?
*/
func sig(x int) int {
if x < 0 {
return -1
} else if x > 0 {
return 1
}
return 0
}
func wiggleMaxLength(nums []int) int {
if nums == nil || len(nums) == 0 {
return 0
}
pSig := 0
cnt := 1
for i := 1; i < len(nums); i++ {
flag := sig(nums[i] - nums[i-1])
if flag == 0 || flag == pSig {
continue
} else {
pSig = flag
cnt++
}
}
return cnt
}