算法学习-构造

构造题会让我们按照一定的规律去构造一个符合条件的结果,其通常是和其他算法结合起来考察的,其中的规律有时候是比较难找的,因此只能对其进行规律总结。

相关题目

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)
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网民工蒋大钊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值