Leetcode#2@2017

考试周的题目堆到了现在 。在补。
week7是我自己出的题。96,95,279.
week8的list:381,380,344.
week9的list:238,384,108.


96 二叉搜索树有几种。
自己给自己挖的坑真难出来啊。
想了下找规律:1有1种;2有2种。3呢?
规律很好找。但是。感觉不会用py了。List掌握的不太好
这样写的问题究竟在哪。。。然后我用了append。

        nums=[1,1]+[0]*(n-1)
        for i in range(2,n+1):
            for j in range(i):
                nums[i]=nums[i]+nums[i-1-j]*nums[j]
        return nums[n]

95是升级版。
上一题的情况是左侧n种可能,右侧m种可能,那么就一定会有nm种可能
这题是把m
n种可能列出来。如果沿用96的做法,GG。分治法即可。

def dfs(self,start,end):
        if start > end:
            return [None]
        ans = []
        for val in range(start, end + 1):
            leftTree = self.dfs(start, val - 1)
            rightTree = self.dfs(val + 1, end)
            for l in leftTree:
                for r in rightTree:
                    root = TreeNode(val)
                    root.left = l
                    root.right = r
                    ans.append(root)
        return ans

279除了暴力以外没有想到正常思路。
暴力思路如下:
1:列出n-sqrt(n)^2,...n-1的值。得0就返回,否则保留差值。
2:对上一步的差值重复1的运算。
3:根据2的相差值继续。
4:根据3的相差值继续。
最多到n也就结束了。每一轮的数据量都会减小。
n没有给范围,真是难过。
(根据后来下一段话,我们知道这个循环次数最多也就到4了)
复杂度最多到n的1.5次方。
看到的最优解是利用大自然的智慧的。我猜到会有规律。但是这个规则我不知道。
感谢拉格朗日。。。

        while(n%4==0):
            n/=4
        if(n%8==7):
            return 4
        m=int(math.sqrt(n))
        for a in range (m+1):
            b=int(math.sqrt(n-a*a))
            if(a*a+b*b==n):
                if(a):
                    return 2
                else:
                    return 1
        return 3

本来想return a?2:1的。py貌似不支持这样写 。
在C里面可以更简单:1+!!a就可以了。
自己挖的坑真是不好出。。。
dp解法的伪代码:

for(...)
  dp[i]=n;
  for()
    dp[i]=Math.min(dp[i],dp[i-j*j]+1);

还有一种广搜的解法;


week8想弃疗了咋整
381 设计数据结构的插删&随机返回操作 时间O(1)
直接看题解去了。defaultdict是个好东西
然后没看懂remove怎么搞。。。 题解
380没有重复值就容易了很多。直接remove丢出去
344。。。我记住python的字符串反转怎么写了。

return s[::-1]

java也一样 stringbuffer


week9
238:暴力过。(差点以为我只会暴力)

        n,m,flag=1,[],True
        for i in nums:
            if(i==0 and flag):
                flag=False
                continue
            if(i==0 and flag==False):
                return [0]*len(nums)
            n*=i
        for i in range(len(nums)):
            if(flag):
                m.append(n/nums[i])
            else:
                if(nums[i]==0):
                    m.append(n)
                else:
                    m.append(0)
        return m

384啊怎么又回去第八周那个画风了、不过这个真的是简单
核心就是随机交换位置。
洗牌算法:
Fisher-Yates:从原有数组中随机抽一个到新数组
Knuth-Durstenfeld:从未处理数据中随机取一个存放在数组尾部。
in-place:如上。
取样算法
108升序转平衡二叉。和95一个套路直接过。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,899评论 0 33
  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,790评论 1 19
  • 忙了一上午,活干完了,下午可交上去了。 这本不是我的工作,如果算,只算兼职吧,其实人家最初找我时,我也没多想什么,...
    铅笔芒种阅读 365评论 0 1
  • 自从2012年3月17日爱上了她,我眼睛里看全天下的丫头子,要么都TM瘦得皮包骨头,要么胖得泰山压顶……
    沈万三_671b阅读 231评论 0 0
  • /接上一篇文章 前一段时间,和管家约了几次饭。那时我准备毕业谋求职业发展,他是刚离开创业公司总经理的岗位。两种恰恰...
    zigi阅读 285评论 1 0

友情链接更多精彩内容