美文网首页
leetcode go 删除排序数组中的重复项 and 盛最多水

leetcode go 删除排序数组中的重复项 and 盛最多水

作者: Winnifred_ | 来源:发表于2020-05-02 16:07 被阅读0次

1.给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

思路:一开始自己的想法是放到map里,其实一般go去重的时候都会选择map实现,然后放到新的切片里就可以了,但是看题,原地删除,后来只能转变思想,看了下题解,因为我是刚开始刷算法,所以并没有技巧,这时候其实对于刚开始刷算法的人,可以自己先想一下自己的思路,然后看最优的题解,学习这种题解的方法,双指针会在很多题运用到,培养这种思路,因为我是凌晨的时候刷的这道题,我看后一度怀疑自己,问题在于,我改变的只是nums[:s+2]的值,后面的值依然没变,依然有值,跟题意不一样,纠结了半小时,为啥就对了,题中是每个元素只出现一次,如果不对nums做截取,你改变的只是部分,nums[s+2:]依然是之前的值,依然可能会存在重复,好吧,到最后我还是不纠结了,只是少一步截取,但是只要明白这种思路就好,双指针中的:快慢指针

go中的最优解法

2.盛最多水的容器

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

示例:输入:[1,8,6,2,5,4,8,3,7]输出:49

我看好几遍题没看懂,看图就可以了,面积为底*高,横坐标好找,对于高度的话,只能找最小值,去乘以横坐标,得到最大面积,同样使用的是双指针

递归:通过调用函数体进行的循环

利用盗梦空间电影来类比递归,则得到:

1.向下进入到不同梦境中,向上又回到原来一层(不能跳跃,只能一层一层上或下)

2.用参数来进行函数不同层间的变量传递(类比盗梦空间中通过声音传到一层)

3.每一层的环境和人物都是一份拷贝,除了主角人物,主角人物可以不同层级的梦境,发生和携带变化,这时的主角团队就类似于函数里的参数,同时还会有一些全局变量

递归写法

1.在写递归时,一定要先把递归的终止条件 terminator,如果没有的话就会造成无限递归或者四递归

2.process,也就是在这一层级写业务代码,逻辑代码

3.drill down 进入到下一层 

4. reverse 最后一步可能有时候不需要,就是清理当前层的参数或者其他数据

递归的思维要点:

1.  不要人肉进行递归,一开始时可以看函数华递归树,但是后续一定要直接看函数本身写递归

2.找到最近最简的方法,将其拆解成可重复解决的问题(重复子问题)

3.数学归纳法思维

爬楼梯问题:

傻递归,fibonacci

动态规划版:(对于递归法优化)

括号生成:

作业:

https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

https://leetcode-cn.com/problems/validate-binary-search-tree/

相关文章

网友评论

      本文标题:leetcode go 删除排序数组中的重复项 and 盛最多水

      本文链接:https://www.haomeiwen.com/subject/nudkghtx.html