文章目录
- 前言
- 1. 两数之和
- 2. 两数相加
- 3.无重复字符的最长子串
- 4. 寻找两个正序数组的中位数
- 5. 最长回文子串
- 10. 正则表达式匹配
- 11. 盛最多水的容器
- 15. 三数之和
- 17. 电话号码的字母组合
- 19. 删除链表的倒数第 N 个结点
- 20. 有效的括号
- 21. 合并两个有序链表
前言
为了学习本文捋顺leetcode热题HOT100的汇总 方便自己秋招刷题 仅作刷题笔记使用 感兴趣的小伙伴点一个赞吧
1. 两数之和
点击跳转
题解 请点击
掌握hash中containsKey的方法
2. 两数相加
原题链接
题解详解
用链表演示数字相加的过程
3.无重复字符的最长子串
原题链接
题解详解
hashMap中的方法
4. 寻找两个正序数组的中位数
原题链接
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int total = nums1.length + nums2.length ;
if(total % 2 == 0){
int left = f(nums1, 0 ,nums2 ,0 , total / 2 );
int right = f(nums1, 0 ,nums2 ,0 , total / 2 + 1 );
return (left + right) / 2.0 ;
}else{
return f(nums1 , 0 , nums2 , 0 , total / 2 + 1);
}
}
public int f(int[] nums1 , int i , int[] nums2 , int j , int k){
//默认长度 第一个小
if(nums1.length - i > nums2.length - j) return f(nums2 ,j ,nums1,i ,k);
// 处理边界问题 如果第一个数组用完
if(nums1.length == i) return nums2[j + k -1];
if(k == 1) return Math.min(nums1[i] , nums2[j]);
int si = Math.min(nums1.length,i + k /2) ;
//int si = i + k / 2 ;
//si如果不取最小的话 就会出现出界的问题 因为si可能为0 本身就短
int sj = j + k - k /2 ;
//也就是第1种情况 去掉第一个的前半段
if(nums1[si-1] < nums2 [sj-1]) return f(nums1,si,nums2,j,k - (si - i));
else return f(nums1,i,nums2,sj,k -(sj-j));
}
}
题解详解
5. 最长回文子串
原题链接
l 和r 是左右边界 进行操作时候从i 向两边扩展 如果是奇数的话 所以这个时候 l-- r++ 然后当两个字符串字母相等的时候 还会进行一次l-- r++ 所以这时候长度就为 l -1 和 r+1 之间 所以长度为l - r - 1 ;
题解详解
10. 正则表达式匹配
原题链接
题解详解
11. 盛最多水的容器
原题链接
题解详解
15. 三数之和
原题链接
题解详解
17. 电话号码的字母组合
原题链接
题解详解
19. 删除链表的倒数第 N 个结点
原题链接
题解详解
20. 有效的括号
原题链接
题解详解
21. 合并两个有序链表
原题链接
题解详解