题目:
对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:
对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。
那么数组 A 是漂亮数组。
给定 N,返回任意漂亮数组 A(保证存在一个)。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/be… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
题意可转化为:对每个 k: i < k < j , 都满足A[k] * 2 != A[i] + A[j]。不等式左侧为偶数,只要使右侧为奇数则可以不等式成立。如N=5:
需要用到性质: 1.left是奇数漂亮数字,right是偶数漂亮数组,则left+right也是漂亮数组(证明:i < k < j,如果j,k都在left,left已是漂亮数组必然满足漂亮数组条件,如果j在right范围则right[j]是偶数,left[i]是奇数,也满足A[k] * 2 != A[i] + A[j]。j,k都在right同理可证) 2.A是漂亮数组则A*k + b也是漂亮数组
var m map[int][]int
func beautifulArray(n int) []int {
m = make(map[int][]int)
return coreBeautfulArray(n)
}
func coreBeautfulArray(n int) []int {
if r, ok := m[n]; ok {
return r
}
ans := make([]int, 0)
if n == 1 {
return []int{1}
} else {
for _, r := range coreBeautfulArray((n + 1) / 2){
ans = append(ans, 2 * r - 1)
}
for _, r := range coreBeautfulArray(n / 2) {
ans = append(ans, 2 * r)
}
m[n] = ans
}
return ans
}