mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-24 19:04:32 +08:00
35 lines
672 B
Go
35 lines
672 B
Go
package leetcode
|
|
|
|
func minMoves(nums []int, limit int) int {
|
|
diff := make([]int, limit*2+2) // nums[i] <= limit, b+limit+1 is maximum limit+limit+1
|
|
for j := 0; j < len(nums)/2; j++ {
|
|
a, b := min(nums[j], nums[len(nums)-j-1]), max(nums[j], nums[len(nums)-j-1])
|
|
// using prefix sum: most interesting point, and is the key to reduce complexity
|
|
diff[2] += 2
|
|
diff[a+1]--
|
|
diff[a+b]--
|
|
diff[a+b+1]++
|
|
diff[b+limit+1]++
|
|
}
|
|
cur, res := 0, len(nums)
|
|
for i := 2; i <= 2*limit; i++ {
|
|
cur += diff[i]
|
|
res = min(res, cur)
|
|
}
|
|
return res
|
|
}
|
|
|
|
func min(a, b int) int {
|
|
if a < b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|
|
|
|
func max(a, b int) int {
|
|
if a > b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|