leetcode分类刷题(续2)

Posted Panda_cv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode分类刷题(续2)相关的知识,希望对你有一定的参考价值。

1. 递归

函数直接或者间接调用自己
四个要素:接受的参数,返回值,终止条件,递归拆解

1.1 leetcode509 斐波拉契数列

1.2 leetcode206 反转链表

//伪代码
function(head){
	if(head == null or head.next == null )
		return head;
	
	p =  function(head.next);
	head.next.next = head;
	head.next =  null;

	return p;
}

1.3 leetcode344 反转字符串

 双指针互换                        

2. 分治法

概念:大问题切割成一个个小问题,再合并

2.1 归并排序


2.2 leetcode169 多数元素


2.3 leetcode53 最大子序和

连续子数组
子数组

2.4 leetcode215 数组中k大元素


3. 回溯法

概念:类似枚举,一层一层向下递归,尝试搜索答案
找到答案: 返回答案或者尝试别的可能
找不到答案:返回上一层递归,尝试别的路径
组合问题:
回溯算法:求组合问题!
回溯算法:组合问题再剪剪枝
回溯算法:求组合总和!
回溯算法:电话号码的字母组合
回溯算法:求组合总和(二)
回溯算法:求组合总和(三)

分割问题:
回溯算法:分割回文串
回溯算法:复原IP地址

3.1 leetcode78 子集(模板)

找到所有子集
1. 扩展法 一个一个数扩展
2. 回溯法
3. DFS
  1. 回溯法
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<Integer> list = new ArrayList<Integer>();
        List<List<Integer>> ans = new LinkedList<List<Integer>>();
         ans.add(new ArrayList<>());
        if(nums.length == 0){
            return ans;
        }

        for(int i = 1; i<=nums.length; i++){
            backtracking(nums,ans,i,0,new ArrayList<>());    
        }
        return ans;
    }
    private void backtracking(int[] nums,List<List<Integer>> ans,int length,int index,List<Integer> subset){
        if(subset.size() == length){
            List<Integer> temp = new ArrayList<>(subset);
            ans.add(temp);
            return; 
        }

        for(int i = index;i<nums.length;i++){
            subset.add(nums[i]);
            backtracking(nums,ans,length,i+1,subset);
            subset.remove(subset.size()-1);
        }
    }
}

3.2 leetcode22 括号生成

3.3 leetcode77 组合

3.4 leetcode46 全排列

3.5 leetcode17 电话号码的字母组合

4. DFS

4.1 leetcode78 子集

//深度遍历---也是一种递归,一条路走到底。

以上是关于leetcode分类刷题(续2)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-数据结构-day2

leetcode分类刷题

leetcode刷题题目分类

leetcode刷题分类笔记

leetcode刷题分类笔记

Leetcode刷题笔记-数组