构造题会让我们按照一定的规律去构造一个符合条件的结果,其通常是和其他算法结合起来考察的,其中的规律有时候是比较难找的,因此只能对其进行规律总结。
相关题目
667.优美的排列II
参考宫水三叶的题解,从首位开始按照「升序」间隔排列,次位开始按照「降序」间隔排列(即排列为 [1, n, 2, n - 1, 3, ...]
)时,相邻差值会从 n - 1
开始递减至 1
,共 n - 1
种,是这题的trick。这样的k+1
个数字可以构造k
个差值(与第一个数字是什么无关,比如4、5、6、7、8、9构造成4->9->5->8->6->7),然后只需要让剩余的数字在前面按照升序排列就行。
class Solution {
public int[] constructArray(int n, int k) {
int t=n-k-1;
int[]ans=new int[n];
for(int i=0;i<t;i++){
ans[i]=i+1;
}
for(int i=t,a=n-k,b=n;i<n;){
ans[i++]=a++;
if(i<n) ans[i++]=b--;
}
return ans;
}
}
481.神奇字符串
本题的意思是统计一个由1,2组成的字符串中,前n个字符里1的个数。该字符串中1,2轮换出现,并且「一组1」或者「一组2」出现的次数是由其从前往后的数字本身决定的,参考灵神的题解,其中1和2转换采用了s[-1]^3
的方法。
class Solution:
def magicalString(self, n: int) -> int:
s=[1,2,2]
i=2
while len(s)<n:
s += [s[-1]^3]*s[i]
i += 1
return s[:n].count(1)