Leetcode刷题顺序与总结(更新中)
文章目录
前言
刷题顺序:先从同一类型里题目开始刷起,同一类型里再从简单到中等到困难刷起,题型顺序建议:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论。整理一些自己在刷题时的想法,参考链接:https://github.com/youngyangyang04/leetcode-master
一、数组
1.二分法
适用场景:只要看到面试题里给出的数组是有序数组,都可以想一想是否可以使用二分法
二分法有两种模板,自己只考虑left <= right
时的情况,这样区间定义只考虑[left, right]
。
public static int searchInsert(int[] nums, int target) {
while(nums.length <= 0){
return 0;
}
int left = 0,right = nums.length-1,mid = 0;
while (left <= right){
System.out.println(left+""+mid+""+right);
mid = (right+left)/2;
if(nums[mid] == target){
return mid;
}else if (nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return right + 1;
}
想法:自己做了几道二分法的题目,69,74,offer_53等。题目上大致思路一致,主要考虑区间的问题,建议画图举几个例子确定区间。
2.双指针法
适用场景:是你想要从两端向中间迭代数组。这时你可以使用双指针技巧:一个指针从始端开始,而另一个指针从末端开始。值得注意的是,这种技巧经常在排序数组中使用。
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。比较经典的一道题 T15_三数之和
public static List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
int left,right;
List<List<Integer>> res = new ArrayList<>();
if (nums == null || nums.length <= 2) return res;
for(int i = 0;i <= nums.length - 3;i++)