A:Beautiful Arrangement II Medium
题目:Given two integers n
and k
, you need to construct a list which contains n
different positive integers ranging from 1
to n
and obeys the following requirement:
Suppose this list is [a1, a2, a3, ... , an], then the list [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] has exactly k
distinct integers.
If there are multiple answers, print any of them. The n
and k
are in the range 1 <= k < n <= 10^4.
题意:给定两个整数n和k,要求我们返回一个数组,数组长度为n,元素是从1到n的不同整数,要求满足相邻两个元素的差的绝对值有K种情况,存在多种结果,输出其中一种,
n和k满足1 <= k < n <= 10^4.
思路:
一种是差异值以k为标准为1到k,优先确认数组前面n-k个元素,1,2,3,4,....,n-k,剩余的k-1个元素满足差异值分别是k,k-1,k-2,....1, 元素是n,n-k-1,n-1,n-k-2,n-2,...
一种是差异值以n为标准从n-1,n-2,n-2,...n-k-1 最后的元素的差异值为1,元素的拍了为1,n,2,n-1,3,n-2 ...
方案:以k为差异值标准:
以n为差异值标准:
R: <<二叉搜索树>>, 二叉搜索树有着媲美快速排序的速度,同时又能完成插入、删除和查找等动态化的操作,
高效而又易于实现。对应的生成二叉树的时间复杂度是nlogn和快速排序法一样,只有当输入的数组是一个有序数组时,对应的二叉树的深度和生成的时间复杂度会是n^2。
使用随机化算法确认根节点和其他树节点有助于避免这类极端情况的发生,使时间复杂度可以稳定在nlogn。
T:记录一个处理二维数组的边界情况的技巧,无需对当前的节点的周边的八个节点的情况进行逐一判断,代码更为简洁清晰,直接排除四种不合法的位置:
/**
* 进行内部的数据 的处理 * @param nums 数组 * @param x 行 * @param y 列 * @return */ private int getSum(int[][] nums,int x,int y){ int nx = nums.length; int ny = nums[0].length; int sum = 0; //关于二维数组的周边存在的元素的数量 for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { //数据不合法 if (x + i < 0 || x + i >= nx || y + j < 0 || y + j >= ny) { continue; } sum += nums[x + i][y + j]; } } return sum; }S:分享王铮的《如何权衡选择使用哪种数据结构和算法》,并不是盲目的追求最快的高级的算法,需要根据数据规模和业务场景,
可维护性等方面来进行综合的统筹考虑,通常的业务场景,数据的规模不大,高级算法和暴力破解的效率是接近的,
而且暴力破解的简单算法的课维护性会更高,需要根据情况来讨论,不能盲目求快。