Giả sử chúng ta có một dãy số nguyên, một phép toán di chuyển thực sự là chọn bất kỳ phần tử nào và giảm nó đi 1. Một mảng A là một mảng ngoằn ngoèo nếu 1 hoặc 2 được thỏa mãn -
-
Mọi phần tử được lập chỉ mục chẵn đều lớn hơn các phần tử liền kề, Vì vậy. A [0]> A [1] A [3] ..., v.v.
-
Mọi phần tử được lập chỉ mục lẻ đều lớn hơn các phần tử liền kề, Vì vậy. A [0] A [2] A [4] <..., v.v.
Chúng ta phải tìm số lần di chuyển tối thiểu để biến đổi số mảng đã cho thành mảng ngoằn ngoèo.
Vì vậy, nếu mảng giống như [1,2,3], thì đầu ra sẽ là 2, vì chúng ta có thể giảm 2 xuống 0 hoặc 3 xuống 1
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một phương thức có tên là giải quyết (), phương thức này sẽ nhận nums và bắt đầu, phương thức này sẽ hoạt động như bên dưới -
-
k:=0
-
đối với tôi trong phạm vi bắt đầu có độ dài là num, tăng 2
-
left:=100000 khi i - 1 <0, ngược lại là nums [i - 1]
-
right:=100000 khi i + 1> =độ dài của nums, ngược lại nums [i + 1]
-
temp:=(tối thiểu trái và phải) - 1 - nums [i]
-
nếu temp <0 thì k:=k + | temp |
-
-
trả lại k
-
Trong phương thức chính, nó sẽ là
-
ans:=giải quyết (nums, 0)
-
ans:=tối thiểu ans và giải quyết (nums, 1)
-
trả lại ans
Ví dụ (Python)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
class Solution(object): def solve(self,nums,start): k = 0 for i in range(start,len(nums),2): left = 100000 if i-1<0 else nums[i-1] right = 10000 if i+1>=len(nums) else nums[i+1] temp= (min(left,right)-1 - nums[i]) if temp<0: k+=abs(temp) return k def movesToMakeZigzag(self, nums): ans = self.solve(nums,0) ans = min(ans,self.solve(nums,1)) return ans ob = Solution() print(ob.movesToMakeZigzag([1,2,3]))
Đầu vào
[1,2,3]
Đầu ra
2