9.14 leetcode刷题复习

经验总结:
常用方法:
空间换时间法:开辟新的数组去记录信息
多索引方法:多指针、标记定位+遍历、碰撞指针、滑动窗口
查表法
回溯法:
暴力搜索的实现手段;
for循环遍历当前的所有可能选项;
要么选择,要么不选;
递归:
假设实现,找关系;
子函数递归,主函数调用子函数,以及主函数自身递归)
动态规划:
1.0-1背包问题
2.要么选择,要么不选
3.考虑从[0..n]并选中n


11 盛水容器
方法:碰撞指针
解题思路:
瓶颈在于高
注意left,right边界的操作

13 罗马数字转整数 **
方法:查表法
解题思路:
1.找到规律--数字的表达式?
2.逐个查表
实现:
写成了面向过程逐个if分支的程序,导致代码比较冗长

17 电话号码组合
方法:回溯法
解题思路:
1.构建字母表
2.设计回溯算法(通过递归子函数来实现,调用递归时通过一个for循环遍历每一种可能的选择)

19 删除链表倒数第N个节点
方法:快慢指针法
解题思路:
设计2个指针,一个先走N步,然后下一个再开始走,删除用虚拟头结点

20 有效的括号
方法:栈
解题思路:
根据入栈、出栈来判断

21 合并两个有序链表
方法:多指针法
解题思路:
设计多个指针,操作

22 括号生成 **
方法:回溯法
解题思路:
0.画一个树形图,来判断需要的变量
1.当前操作要么生成(,要么生成)
2.我考虑的是用两个变量来记录左括号和右括号

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        ret.clear();
        getRet(0,0,n,"");
        return ret;
    }
private:
    vector<string> ret;
    void getRet(int left,int right,int n,const string temp){
        if(left==n && right==n){
            ret.push_back(temp);
            return ;
        }
        
        if(left<n)
            getRet(left+1,right,n,temp+'(');
        if(left>right)
            getRet(left,right+1,n,temp+')');
    }
};

代码实现:
用left,right2个变量去记录左括号和右括号的数量,然后每次要么生成左括号,要么生成右括号,注意条件限制,首先左括号数量要保证多于右括号才能生右括号,其次左括号的数量不能超过n

24.两两交换链表中的节点
方法:多指针技术
解题思路:
把需要操作的节点用指针去标记、追踪,即可

26.删除排序数组中的重复项
方法:多索引技术
解题思路:
设计2个索引,1个用来标记位置cur,1个用来遍历i
遍历i指向的元素若符合条件,便放入cur标记的位置

27.移除元素
方法:多索引技术(标记定位+遍历)
解题思路:
同上

39.组合总和 *
方法:回溯法
解题思路:
0.先画树形图,判断哪些是需要的
1.设计递归结构,每次递归前用for去遍历所有可能的选项
2.设计终止条件
经验:
回溯算法的一个小技巧,是把需要维护的状态变量作为形参去引用传递,这样回溯时就可以不用维护了

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        ret.clear();
        int n=candidates.size();
        if(n==0)
            return ret;
        vector<int> temp;
        getRet(candidates,target,0,0,temp);
        return ret;
    }
private:
    vector<vector<int>> ret;
    void getRet(vector<int>& candidates,int target,int index,int sum,vector<int>& temp){
        if(sum==target){
            ret.push_back(temp);
            return ;
        }
        
        int n=candidates.size();
        for(int i=index;i<n;i++){
            if(sum+candidates[i]<=target){
                temp.push_back(candidates[i]);
                getRet(candidates,target,i,sum+candidates[i],temp);
                temp.pop_back();
            }
        }
    }
};

46.全排列
方法:
回溯法
解题思路:
同上

51.N皇后 *
方法:
回溯法
解题思路:
1.设计出对角线、副对角线的判断方式
2.同上

经验:
回溯法和递归设计有1个区别是回溯法是遍历各种可能的选择,然后去判断;递归则类似于数学归纳法,设计好出口,然后假设已经完成该功能,然后向出口去迭代

66.加一 *
方法:
递归
解题思路:
大数加法:
1.基本操作
2.处理进位

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int n=digits.size();
        if(n==0) return digits;
        int carr=1;
        for(int i=n-1;i>=0;i--){
            int d=digits[i]+carr;
            digits[i]=d%10;
            carr=d/10;
            if(carr==0) break;
        }
        if(carr) digits.insert(digits.begin(),carr);
        return digits;
    }
};

代码思路:
因为是加1,直接让carry初值为1即可,没必要拆分成2部分去驱动(拆分是指先做一次加1,再讨论)

69.求平方根 *
方法:
二分查找
牛顿迭代法
扩展:
辗转相除法求最大公约数

class Solution {
public:
    int mySqrt(int x) {
        if(x<2)
            return x;
        long long low=1L,high=(long long)x/2+1;
        while(low<=high){
            long long mid=(long long)low+(high-low)/2;
            long long key=mid*mid;
            if(key==x)
                return mid;
            else if(key<x)
                low=mid+1;
            else
                high=mid-1;
        }
        return high;
    }
};

现在有些搞不清楚二分查找法什么时候用等号了。。。
举例子即可

70.爬楼梯
方法:
dp、递归、循环都可以

75.颜色分类
方法:
桶排序?

77.组合
方法:
回溯法

78.子集 **
方法:
回溯法
解题思路:
0.画树形图
1.要么选择当前元素,要么不选择当前元素

79.单词搜索
方法:
回溯法
问题拆解:
1.边界判断,是否越界
2.4个方向,用1个二维数组记录,这样可以通过for循环去遍历
解题思路:
0.遍历每个单元格
1.从单元格开始查找

80.删除数组重复元素II
方法:
多索引(标记定位+遍历)

88.合并两个有序数组
方法:
开辟新空间法

101.对称二叉树
方法:
递归

102、104、111树的问题
方法:递归

112.路径总和
方法:
递归(子函数递归,主函数调用子函数,以及主函数自身递归)
解题思路:
子函数递归,主函数调用子函数,以及主函数自身递归)

118、119.杨辉三角形 **
方法:
循环、记录、空间换时间法
问题拆分:
1.杨辉三角各行之间的关系(当前行和上一行的规律)
解题思路:
记录上一行
根据上一行计算出当前行
迭代

121.股票买卖时机 *
方法:
贪心?假设法
解题思路:
允许反悔,买高了允许反悔;涨价了,立马收益(卖价-成本价);多次求值取最大值

122.股票买卖时机II *
方法:
贪心?假设法
解题思路:
允许反悔,买高了允许成本降价;涨价了立马收益(卖价-成本价;成本价更新为当前卖价);最终求和

136.找出只出现一次的数字
方法:
异或运算,自己与自己异或为0;0与A异或得A

144、145树的遍历
方法:
1.递归
2.循环(用栈模拟) **

146.LRU算法 ***
方法:
双向链表+hash表映射;头、尾指针

148.链表排序 ***
方法:
递归(子函数递归or非递归实现+主函数调用子函数、主函数递归调用自身)
解题思路:
归并排序:
1.分割链表
2.merge操作

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,411评论 0 1
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 2,909评论 0 1
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,654评论 0 13
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,744评论 0 2
  • 姓名:叶彩霞 【日精进打卡第055天】2018.06.04 第367期(无锡市) 乐观三组 学员 【知~学习】 ...
    透明的水泡阅读 50评论 0 0