932. 漂亮数组

90 阅读1分钟

题目:

对于某些固定的 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
}