0%

作业条:

242. 有效的字母异位词

题目链接:
https://leetcode.cn/problems/valid-anagram/

文章讲解
https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html#%E6%80%9D%E8%B7%AF

视频讲解

第一想法

创建一个26个单位的数组表示每个字母出现的频次,然后分别统计两个单词字母出现的频率,如果不相同则直接返回,如果最后数组一致则为异位词。

看完解答后的想法

相同

实现过程中的问题

349. 两个数组的交集

https://leetcode.cn/problems/intersection-of-two-arrays/

第一想法:

用第一个数组创建一个set,如果第二个数组在这个set里面出现,那么就把这个值加入到结果set;
或者开辟一个长度为1001的数组,然后如果数组1出现,就把对应值设为1;如果数组2里面也出现并且hash值为1,那么就是相交数字。

看完解答后的想法:

实现过程中的问题:

注意unordeder_set的使用方法
初始化:unordered_set set1(nums1.begin(),nums1.end());
查找:set1.find(num)!=set1.end()
插入:res.insert(num);

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

第一想法:

没看明白

看完解答后的想法:

每次计算每个位上数字的平方和,然后判断这个和有没有在set中出现,如果出现过则表示重复,不是happy数;如果是1则是happy数。

实现过程中的问题:

1.两数之和

题目链接:
https://leetcode.cn/problems/two-sum/

文章讲解
https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E6%80%9D%E8%B7%AF

视频讲解

第一想法

用双重循环遍历数组

看完解答后的想法

用map保存数字和下标,然后用target-nums[i]直接找有没有对应的,如果没有,则加入map;如果有,则输出两个值的下标

实现过程中的问题

注意map的初始化和使用
std::unordered_map <int,int> map;
auto iter = map.find(target - nums[i]);
if(iter != map.end())
return {iter->second, i};
map.insert(pair<int, int>(nums[i], i));

今日收获和学习时长

2h

作业条:

24. 两两交换链表中的节点

题目链接:
https://leetcode.cn/problems/swap-nodes-in-pairs/

文章讲解
https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E6%80%9D%E8%B7%AF

视频讲解
https://www.bilibili.com/video/BV1YT411g7br/

第一想法

直接对两个相邻链表指针进行反转,但是到反转下两个的时候发现不太对,因为第一个没办法指向第三个

看完解答后的想法

思路要用第一个操作后面两个节点,而不仅仅是对两个节点的操作

  1. 什么时候需要考虑加dump head?
  2. 判断循环终止的条件到底是cur不为空还是cur->next不为空:当链表为奇数的时候是cur->next->next为空结束,当链表为偶数是cur->next为空结束
  3. 下一次循环只需要把cur赋值为cur->next->next就可以,不用管是不是交换过了值

实现过程中的问题

主要注意循环条件

19. 删除链表的倒数第 N 个结点

题目链接:
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
文章讲解
https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html#%E6%80%9D%E8%B7%AF
视频讲解
https://www.bilibili.com/video/BV1vW4y1U7Gf/?spm_id_from=333.788

第一想法:

只是有印象要用快慢指针,但是具体怎么用忘记了。还以为是直接一个指针走到size-n的位置,但是链表没有具体的size,所以需要遍历两遍;
但是快慢指针,快指针先走,慢指针再走,其实也是遍历两遍;

看完解答后的想法:

看完解答之后发现只需要让快指针多走就可以了。

  1. 怎么确定快指针要走快多少步
  2. 循环终止条件
  3. 需不需要dumphead: 需要
    快指针比慢指针走快n+1步,并且快指针不为空;
    快指针比慢指针走快n步,并且快指针->next不为空;
    这两个判断条件一样吗?一样的,两种写法都可以。

实现过程中的问题:

面试题 02.07. 链表相交

题目链接:
https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

文章讲解
https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html#%E6%80%9D%E8%B7%AF

视频讲解

第一想法

用两个指针分别指向两个链表,当遍历完自己之后去遍历对方,最终两个指针如果相等就是相交的节点。

看完解答后的想法

想法一致

实现过程中的问题

循环结束条件:当两个链表相交的时候,结束条件为指针相同;当两个链表不相交的时候,最终两个指针的值也会相同并且为null

今日收获和学习时长

3h

作业条:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6

203.移除链表元素

题目链接:
https://leetcode.cn/problems/remove-linked-list-elements/

文章讲解
https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html

视频讲解
https://www.bilibili.com/video/BV18B4y1s7R9/?spm_id_from=pageDriver

第一想法

删除元素的时候注意处理头结点的特殊情况或者插入一个新的头结点;
在做的时候用了双指针的思路,一个标记pre,一个标记当前节点p

实现过程中的问题

在实现过程中混淆了break和continue的用法,break是结束所有循环,continue是结束当前循环
注意删除不需要的节点

看完解答后的想法

解答也是考虑了是否插入头结点的方法,但是在判断循环的时候用的是p->next,删除元素的时候用了一个tmp节点。

707 设计链表

第一想法:

把链表指针反方向指

看完解答后的想法:

想复杂了,还想加一个dumphead以及判断链表是不是空的,是不是只有一个元素,结果看了一眼解答,不加dumphead之后写法更简洁,并且能统一处理上面的边界情况

实现过程中的问题:

今日收获和学习时长

2小时28分

作业条:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG

977.有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html

视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

第一想法

暴力:计算每个数字的平方,然后整体排序 O(nlogn)
双指针:找到最小值,用两个指针分别指向最小值左边和右边,然后比较两个平方值,小的放入新数组;
双指针分别指向头和尾,比较头尾两个的平方值,较大的放入数组尾部

看完解答后的想法

同上

实现过程中的问题

写数组从小到大排序发现太麻烦了,然后想到了可以从后向前

209.长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

第一想法:

利用滑动窗口和两个指针分别指向窗口第一个位置和结束位置,先将元素加入窗口,判断窗口的和,如果满足条件那么记录下当前的长度;
然后再缩小左边的窗口,如果仍然满足条件,判断和之前的长度取最小长度记录下来。

看完解答后的想法:

同上

实现过程中的问题:

  1. 算法的终止条件是什么?由于算法最后遍历了所有的元素,所以终止条件是其中一个指针(窗口右端)遍历完数组。
  2. 如何组织算法流程?外循环遍历数组,计算元素的和,然后判断是否满足条件,不满足则直接跳出循环进行下一次加入;满足条件的情况下,先记录下当前满足条件的长度,然后尝试缩减长度,记录缩减后并且还满足条件的最小长度;

59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

第一想法:

按照螺旋的顺序依次打印数组,只是知道这个想法,但是具体实现的时候对想法模糊不清。

看完解答后的想法:

  1. 循环终止条件:循环的圈数是n/2,因为每次一圈包含两行/列;注意n如果是奇数的情况,单独处理最后一个数
  2. 每一圈的处理:按照螺旋循环,每次左开右闭
  3. 如何控制每一圈的赋值:使用一个变量标记每圈的起始位置,以及每行/列的终止位置

实现过程中的问题:

每次循环开始都是不固定的,所以每次startx和starty要赋值给i,j;
对奇数矩阵中心数的处理

今日收获和学习时长

1小时18分

作业条:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY

704 二分查找

https://leetcode.cn/problems/binary-search/

文章讲解
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html

视频讲解
https://www.bilibili.com/video/BV1fA4y1o715

第一想法

二分查找经典题目,边界条件是left<=right,然后取中间的指针,和target比较,分别修改left和right的值直到最后找到;如果超出边界条件仍然没找到,返回-1;

看完解答后的想法:

需要注意循环不变量,也就是搜索的区间到底是左闭右闭还是左闭右开,并且要在设置边界值的时候坚持这个不变。

左闭右闭的写法,left = 0 ; right = num.size -1; while(left <= right ) left/right = mid+/-1;
左闭右开的写法,right = nums.size; while(left < right>) right = mid; left = mid+1;

二分查找需要思考的几个点:

  1. 循环的停止条件 while (low <= high)是因为有可能查找到两端的值
  2. 取中位数的方法 mid = low + (high-low)/2,防止high+low/2溢出
  3. 边界收缩:如果要找的值在左边这块,那么右边界-1;右边同理;-1是因为值不可能在mid;
  4. 返回值,找到返回mid,没找到即循环结束,返回-1;
  5. 其他输入异常情况
  6. 注意条件:是否是有序

实现过程中的问题

思路是对的,但是有细节需要改善;比如如何取中间值不越界;边界条件是<还是<=

27. 移除元素

题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

第一想法:

暴力法:遍历判断当前元素是不是要移除的元素,如果是的话,把它后面所有元素前移;
双指针法:一个指针遍历数组,一个指针指向新数组当前位置;如果是要移除的元素,快指针+1,慢指针不变;如果不是要移除的元素,fast指向的值赋值给slow指向的值,fast+1,slow+1;返回slow

最终想法:

  1. 两个指针的初始位置都是0,快指针从0走到最后一位,慢指针只在快指针不等于val的时候才会走。
  2. 循环终止条件:快指针遍历完数组
  3. 返回值:慢指针-1+1(慢指针在的位置是最终数组+1的位置,所以-1,但是这个位置是下标,需要再+1)

实现过程中的问题:

第二次做,出错的地方在于应该是判断快指针的值和val,而不是慢指针

今日收获和学习时长

自己写的过了,复习了一遍,学习1.5h

本文介绍常用的数据结构和算法,并给出每种数据结构和算法对应的经典习题,详细的解答可以参考下一篇习题解。本文的目录如下:

  1. 基础的数据结构
  2. 高级数据结构
  3. 排序算法
  4. 递归和回溯算法
  5. 深度优先遍历和广度优先遍历算法
  6. 动态规划
  7. 二分搜索和贪婪算法
阅读全文 »

前言

阶层固化(引发人的焦虑)

普通人如何打破?我这里有个秘籍,不分男女、阶层、学历等等都可以适用(听完开心死了)。

定投,即在未来5-10年(长期)每周(定期)投资人和值得长期投资并持有的标的

问题:

  1. 如何判断标的是否值得长期投资并持有
    
  2. 投资金额有没有起点金额,累加金额应该是多少
    
  3. 如何判断何时进入
    
  4. 如何判断何时回收资金
    
  5. 如果判断趋势是下降的,何时止损?
    
阅读全文 »

从市场对象来说,分为一级市场和二级市场。一级市场通常包括风险投资、私募股权、IPO等。一级市场流动性比较差,可能很难找到买家接手。二级市场通常指股市。它们最大的区别就是流动性。

阅读全文 »