刷题之前先把这100道题里做过的回顾一下再开始今天的三道题。巩固一下。
题1:两数之和
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] results=new int[2];
if (nums.length==0||nums==null){
return null;
}
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int temp= target-nums[i];
if (map.containsKey(temp)){
results[1]=i;
results[0]=map.get(temp);
}
map.put(nums[i],i);
}
return results;
}
}
HashMap的经典用法案例,同时解题思想也很有趣,通过排查筛选每一次存入map中的元素里有没有target的差值temp。比较简单,开拓思维。
题2:两数相加
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead=new ListNode(-1),pre=dummyHead;
int t=0;
while(l1!=null||l2!=null||t!=0){
if(l1!=null){
t+=l1.val;
l1=l1.next;
}
if(l2!=null){
t+=l2.val;
l2=l2.next;
}
//新列表才开始依次链接
pre.next=new ListNode(t%10);
//pre相当于新列表的指针
pre=pre.next;
//刷新t,保留上一位计算满10进1的机制
t/=10;
}
return dummyHead.next;
}
}
经典的列表操作,使用的是自定义的listnode,包括简单的val属性和next操作,除此之外,关于“探头”dummyhead的使用也得记住,一般列表题都会涉及到新列表的定义方便做链接和值的运算,先搞一个探头,有助于后续的连接工作能更有条不紊。
复习一下两种基础思想的list:
arraylist相当于可调节容量的可嵌套的数组。而linkedlist会更多的在解题中应用,其直观的数据结构就是堆栈、队列、双队列。
题3:无重复的最长字符串
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;
int left = 0;
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-left+1);
}
return max;
}
}
经典滑动窗口理解题,首先理解滑动窗口的原理是什么:
什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,将插入的元素代替原有的元素的val,直到满足题目要求!一直维持这样的队列,找出队列出现最长的长度时候,求出解!
抓关键词:当在进入a,不满足要求,移动队列,即:需要一个结构体来存储“窗口”的内容。这个结构体对象可以随意查询新加入的元素是否已在已加入的队列中存在。如果使用一般理解的list或者stack去做遍历,很明显会增大时间复杂度,所以是个很经典的map的利用,key作为输入的内容,value作为输入的位置。
题20:有效的括号
匹配括号,匹配问题第一时间想到用堆栈。
class Solution {
public boolean isValid(String s) {
if(s.isEmpty())
return true;
Stack<Character> stack=new Stack<Character>();
for(char c:s.toCharArray()){
if(c=='(')
stack.push(')');
else if(c=='{')
stack.push('}');
else if(c=='[')
stack.push(']');
else if(stack.empty()||c!=stack.pop())
return false;
}
if(stack.empty())
return true;
return false;
}
}
只要依次放入左符号即可,如果放入右符号即去匹配上一次放入的左符号是否是匹配的,不是就返回false。
总结就到这儿,刷题准备分类别去刷,今天刷3个栈的题,刷完后回顾总结。