[Swift]LeetCode1144. 递减元素使数组呈锯齿状 | Decrease Elements To Make Array Zigzag
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11297773.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given an array nums
of integers, a move consists of choosing any element and decreasing it by 1.
An array A
is a zigzag array if either:
- Every even-indexed element is greater than adjacent elements, ie.
A[0] > A[1] < A[2] > A[3] < A[4] > ...
- OR, every odd-indexed element is greater than adjacent elements, ie.
A[0] < A[1] > A[2] < A[3] > A[4] < ...
Return the minimum number of moves to transform the given array nums
into a zigzag array.
Example 1:
Input: nums = [1,2,3] Output: 2 Explanation: We can decrease 2 to 0 or 3 to 1.
Example 2:
Input: nums = [9,6,1,6,2] Output: 4
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 1000
给你一个整数数组 nums
,每次 操作 会从中选择一个元素并 将该元素的值减少 1。
如果符合下列情况之一,则数组 A
就是 锯齿数组:
- 每个偶数索引对应的元素都大于相邻的元素,即
A[0] > A[1] < A[2] > A[3] < A[4] > ...
- 或者,每个奇数索引对应的元素都大于相邻的元素,即
A[0] < A[1] > A[2] < A[3] > A[4] < ...
返回将数组 nums
转换为锯齿数组所需的最小操作次数。
示例 1:
输入:nums = [1,2,3] 输出:2 解释:我们可以把 2 递减到 0,或把 3 递减到 1。
示例 2:
输入:nums = [9,6,1,6,2] 输出:4
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 1000
4ms
1 class Solution { 2 func movesToMakeZigzag(_ nums: [Int]) -> Int { 3 if nums.count < 3 { 4 return 0 5 } 6 7 let n = nums.count 8 var result1 = 0 9 var result2 = 0 10 11 var i = 1 12 while i < n { 13 var minValue = min(nums[i-1], i+1 < n ? nums[i+1] : 1000) 14 if minValue <= nums[i] { 15 result1 += (nums[i]-minValue+1) 16 } 17 i += 2 18 } 19 20 i = 0 21 while i < n { 22 var minValue = min(i > 0 ? nums[i-1] : 1000, i+1 < n ? nums[i+1] : 1000) 23 if minValue <= nums[i] { 24 result2 += (nums[i]-minValue+1) 25 } 26 i += 2 27 } 28 29 return min(result1, result2) 30 } 31 }
8ms
1 class Solution { 2 func movesToMakeZigzag(_ nums: [Int]) -> Int { 3 var result = [0, 0] 4 let n = nums.count 5 var left = 0 6 var right = nums.count - 1 7 8 for i in 0..<n { 9 left = i > 0 ? nums[i-1] : 1001 10 right = i + 1 < n ? nums[i+1] : 1001 11 result[i%2] += max(0, nums[i] - min(left, right) + 1) 12 } 13 return result.min()! 14 } 15 }
Runtime: 8 ms
Memory Usage: 20.8 MB
1 class Solution { 2 func movesToMakeZigzag(_ nums: [Int]) -> Int { 3 var n:Int = nums.count 4 var j:Int = 0 5 var s:Int = 0 6 var t:Int = 0 7 for i in stride(from:0,to:n,by:2) 8 { 9 j = 0 10 if i != 0 11 { 12 j = max(j,nums[i]-nums[i-1]+1) 13 } 14 if i + 1 < n 15 { 16 j = max(j,nums[i]-nums[i+1]+1) 17 } 18 s += j 19 } 20 for i in stride(from:1,to:n,by:2) 21 { 22 j = 0 23 if i != 0 24 { 25 j = max(j,nums[i]-nums[i-1]+1) 26 } 27 if i + 1 < n 28 { 29 j = max(j,nums[i]-nums[i+1]+1) 30 } 31 t += j 32 } 33 return min(s,t) 34 } 35 }
12ms
1 class Solution { 2 func movesToMakeZigzag(_ nums: [Int]) -> Int { 3 var movesA = 0 4 var movesB = 0 5 var array = nums 6 for i in stride(from: 1, to: array.count, by: 2) { 7 while array[i - 1] <= array[i] { 8 movesA += 1 9 array[i] -= 1 10 } 11 12 guard (i + 1) < array.count else { break } 13 14 while array[i + 1] <= array[i] { 15 movesA += 1 16 array[i] -= 1 17 } 18 } 19 array = nums 20 for i in stride(from: 1, to: array.count, by: 2) { 21 while array[i - 1] >= array[i] { 22 movesB += 1 23 array[i - 1] -= 1 24 } 25 26 guard (i + 1) < array.count else { break } 27 28 while array[i + 1] >= array[i] { 29 movesB += 1 30 array[i + 1] -= 1 31 } 32 } 33 34 return movesA < movesB ? movesA : movesB 35 } 36 }