LeetCode刷题心得

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MrWilliamVs/article/details/88787333

Move Zeroes:
不能创建新数组,只能在原始输入数组上,通过移动的方式得到想要的结果。
数组变换的范围,面试重点、 Array Transformation. 数组是极其简单,容易使用的数据结构、
把0全部移到数组的后面;非0元素保持原本顺序不变。
解决思路:两个要求是相互独立的,可以各自解决,然后拼起来。

438. Find All Anagrams in a String:
找到所有的乱序子串。(与顺序无关,只需子串里面的个数,类型都匹配就行)
解法1: p用map存储,遍历s,满足map里面的情况就行。

trick:
vector cnt(128, 0)
cnt[char] ++; 数组当字典用,char对应的ascii值即为数组下标。

vector tmp = cnt; 直接拷贝。

581. Shortest Unsorted Continuous Subarray
给定一个数组,找到一个子数组,子数组排序完之后,整个数组就是有序的了,找到最小的这个子数组。(整体应该是升序)

思路:找出违反正常顺序的最边界的两个位置,beg,end,按照降序的思路去找。从左到右去找最大值,找最大值的同时,比他小的值的位置,就是右边界(说明降序,是顺序不对的);同理,从右向左找最小值,同时,当前位置比最小值大的,就是左边界。

C++ 链表操作使用,
会创建链表,链表的遍历,增加删除结点。
ListNode* reverse = new ListNode(0); //创建一个临时指针
ListNode* dummy = reverse; //这个是链表的头,读取时从这里开始读
for(int i=tmp.size()-1; i>=0; i–){
reverse->next = new ListNode(tmp[i]);
reverse = reverse->next; //临时指针,一直在移动。
}
return dummy->next; //输出整个链表用这个。

头插法: 每一个新节点 都插在原来第一个节点的前面。后来居前,链表逆序。(借助p指针,将q插到head前面)

尾插法:习惯的插入方式,链表尾部插入一个节点。

快慢指针方法:经典应用。(判断链表是否有环,如果有环,则快慢指针必会相遇; 也可以用哈希表或集合存储出现过的节点,节点出现两次,就是有环)
空指针没有next, next可以为空,

  1. Valid Parentheses
    解题思路:左括号,利用栈的数据结构,将对应的右括号入栈; 碰到右括号,开始匹配栈里的右括号,不匹配就返回false。(题目要求符合栈的结构,最开始碰到的右括号,和栈顶的左括号匹配)

猜你喜欢

转载自blog.csdn.net/MrWilliamVs/article/details/88787333