摘要:
仅供自己学习 思路: 第一个O(M+N)的空间复杂度。因为是原地算法,所以当我们根据0的位置更改为0后,我们再次遍历到0就会无法判断原来就是0还是更改后为0的。所以需要一个M*N的数据结构来记录原来为0的位置。 第一种 copy一个matrix,然后遍历copy的,如果有0就在matrix更改即可。 阅读全文
摘要:
仅供自己学习 思路: 全排列,每个点都和其他所有点有不同顺序的排列。可以用DFS,但是是每DFS一次都要从头开始遍历组合,因为是全排列嘛,那这就出现一个问题了对于 1,2,3,4这个数组,我从2开始组合,会从第一个开始,2,1,选了1后又会重新开始遍历组合,遇到1,2,都已经不能再添加了,那么我们就 阅读全文
摘要:
仅供自己学习 思路: 这种简单的题可以有更深层次的讨论。 先给出两种方法的代码: 首先是直接更改nums数组: 1 class Solution { 2 public: 3 vector<int> runningSum(vector<int>& nums) { 4 5 for(int i=1;i<n 阅读全文
摘要:
仅供自己学习 思路: 因为要建立的最小高度的的二叉搜索树,且已经升序排序,根据左小右大的原理,我们可以通过二分,每次以部分区间的中心节点作为父亲节点,这样能保持两端平衡而达到最小高度。再将mid点左边的作为左子树再次递归,右边作为右子树再次递归,就能满足左小右大。 代码: 1 /** 2 * Def 阅读全文
摘要:
仅供自己学习 思路: 贪心,遍历所有数据,每次取最小的边作为该矩形能切割成最大的正方形的边,然后判断是否比之前获得的maxlen更大,如果大那么久更新maxlen为更大的边,并且计数归1重新开始。如果该切割的边等于maxlen,就计数即可: 1 class Solution { 2 public: 阅读全文
摘要:
仅供自己学习 思路: 这种有计算顺序的题,可以用栈解决,同样是滞后如何处理的问题。遍历token,如果是数字就加入进栈,如果是运算符号,就取出栈顶和栈顶前一个数进行计算,并把这两个数pop掉,然后再把结果加入进栈。 因为token的元素是string,所以用int类型的栈时候,加入数字,得用c_st 阅读全文
摘要:
仅供自己学习 思路: 用hashmap存,将每个元素-‘0’然后得到的值作为索引,然后在加1,并判断如果这个索引的元素大于1,那么就有重复的元素,返回false; 1 class Solution { 2 public: 3 bool isUnique(string astr) { 4 unorde 阅读全文
摘要:
仅供自己学习 思路: 直接用一个队列添加请求,并判断所有队列中的请求时间被 t 减是否大于3000,如果大于3000则超过了[t-3000,t]的范围,就pop出去。最后返回queue的大小就可以。 1 class RecentCounter { 2 private: 3 int req=0; 4 阅读全文
摘要:
仅供自己学习 思路: 这种要找出让树出现环而不成为树的边,可以通过查并集来寻找,因为当我们按顺序遍历所有节点。如果是树,那么就会遍历所有边到的都是目前的新结点,也就是没有加入树,不是同一个查并集里面的,也就不成环了,遍历后才会加入树才进入相同的查并集,但如果遍历边,边的两个端点是同一个查并集的,那是 阅读全文
摘要:
仅供自己学习 思路: 直接判断每一个位有没有1,如果有1,计数一次即可。 因为二进制每个位的关系是2^N-1,所以我们用n & (1<<i)即可判断每个位是否为1,1<<i 是将1位移i位,即把第0位的1左移i位。 代码: 1 class Solution { 2 public: 3 int ham 阅读全文