arr[i] + arr[k] != 2*arr[j]

344 阅读1分钟

一、题目描述:

给定一个正整数M,请构造出一个长度为M的数组arr, 要求对于任意的i,j,k三个位置,如果i<j<k,都有arr[i] + arr[k] != 2*arr[j],返回构造出的arr(满足情况的一种)。

示例:

示例 1:

输入:1
输出:[1]

示例 2:

输入:3
输出:[1, 5, 2]
示例 3:

输入:5
输出:[ 1, 5, 3, 2, 6]

二、思路分析:

利用奇数偶数来举例。此题核心主要是列举一个满足 a + c != 2b的例子。

当长度为1时,直接返回任意一个数都满足情况。
当长度不为1时,我们可以将数组划分成两半,前半份为奇数,后半份为偶数。

长度为2时,arr = [1,2]。根据长度为1的扩展。分别为第一个奇数、第一个偶数。
长度为3时,arr = [1,3,2]。根据长度为2(3的一半)的扩展。第一个奇数、第二个奇数,第一个偶数。
长度为4时,arr = [1,3,2,4]。根据长度为2(4的一半)的扩展。第一个奇数、第二个奇数,第一个偶数、第二个偶数。
长度为5时,arr = [1, 5, 3, 2, 6]。根据长度为3(5的一半)的扩展。第一个奇数、第三个奇数、第二个奇数,第一个偶数、第三个偶数。
。。。
以此类推。

使用递归,利用上一个结果,求其结果。

image.png

三、AC 代码:

function makeNo(size) {
  if (size === 1) return [1]
  let halfSize = Math.floor((size + 1) / 2)
  console.log(halfSize);
  let base = makeNo(halfSize)
  let res = []
  let index = 0
  for (; index < halfSize; index++) {
    res[index] = base[index] * 2 - 1
  }
  console.log(res,index)
  for (let i = 0; index < size; index++, i++) {
    // 偶数
    res[index] = base[i] * 2
    console.log(base[i])
  }
  return res
}

四、总结:

此题只要满足情况即可,根据奇数偶数只是其中一种方法。