932. 漂亮数组
- 原题链接:
- 完成情况:
- 解题思路:
- 参考代码:
原题链接:
932. 漂亮数组
https://leetcode.cn/problems/beautiful-array/description/
完成情况:
解题思路:
nums 是由范围 [1, n] 的整数组成的一个排列。对于每个 0 <= i < j < n ,均不存在下标 k(i < k < j)使得 2 * nums[k] == nums[i] + nums[j] 。题目解释:【输入】 -> 输入一个n,n即长度,用到的数字,则是1-n这n数字【输出】 输出,由1-n这n数字组成的一个数组,然后数组要满足一下的条件,即不存在:对于每个 0 <= i < j < n ,均不存在下标 k(i < k < j)使得 2 * nums[k] == nums[i] + nums[j] 。解题思路:个人感觉肯定需要用到的是dp,即因为需要找到一个满足上要求的数组,则至少要保证在,之前的长度中,他其实就需要满足长度需求。即,在原本已经满足题目要求的完美数组中,我又重新插入一个新的数组,然后这个数组我又去找到一个合适的插入位置,使它满足要求。
参考代码:
package LeetCode中等题;import java.util.HashMap;
import java.util.Map;public class __932漂亮数组__发现规律_进行分治 {/**nums 是由范围 [1, n] 的整数组成的一个排列。对于每个 0 <= i < j < n ,均不存在下标 k(i < k < j)使得 2 * nums[k] == nums[i] + nums[j] 。题目解释:【输入】 -> 输入一个n,n即长度,用到的数字,则是1-n这n数字【输出】 输出,由1-n这n数字组成的一个数组,然后数组要满足一下的条件,即不存在:对于每个 0 <= i < j < n ,均不存在下标 k(i < k < j)使得 2 * nums[k] == nums[i] + nums[j] 。解题思路:个人感觉肯定需要用到的是dp,即因为需要找到一个满足上要求的数组,则至少要保证在,之前的长度中,他其实就需要满足长度需求。即,在原本已经满足题目要求的完美数组中,我又重新插入一个新的数组,然后这个数组我又去找到一个合适的插入位置,使它满足要求。* @param n* @return*/Map<Integer,int []> memo = new HashMap<Integer,int []>();public int[] beautifulArray(int n) {return partition_findRule(n);}/**** @param n* @return*/private int[] partition_findRule(int n) {if (memo.containsKey(n)){return memo.get(n);}int res [] = new int[n];if (n == 1){res[0] = 1;}else{int temp = 0;for (int x:partition_findRule((n+1)/2)){ //取所有的偶数oddsres[temp++] = 2 * x - 1;}for (int x:partition_findRule(n/2)){ //取所有的奇数evensres[temp++] = 2 * x;}}memo.put(n,res);return res;}
}