leetcode47题

文章目录

  • 1 数组/字符串
    • 1.1 文本左右对齐
  • 2 双指针
  • 3 滑动窗口
    • 3.1 串联所有单词的子串
  • 4 矩阵
  • 5 哈希表
    • 5.1 最长连续序列
  • 6 区间
    • 6.1 用最少数量的箭引爆气球
  • 7 栈
    • 7.1 基本计算器
  • 8 链表
    • 8.1 k个一组翻转链表
    • 8.2 LRU缓存
  • 9 二叉树
    • 9.1 二叉树的最近公共祖先
    • 9.2 二叉树的直径
  • 10 二叉树层次遍历
  • 11 二叉搜索树
  • 12 图
    • 12.1 克隆图
    • 12.2 除法求值
  • 13 图的广度搜索遍历
    • 13.1 蛇梯棋
    • 13.2 单词接龙*
  • 14 字典树
    • 14.1 实现Trie树
    • 14.2 添加与搜索单词 - 数据结构设计
    • 14.3 单词搜索II*
  • 15 回溯
    • 15.1 组合总和
    • 15.2 N皇后II
    • 15.3 单词搜索
  • 16 分治
    • 16.1 将有序数组转换为二叉搜索树
    • 16.2 排序链表
    • 16.3 建立四叉树
    • 16.4 合并 K 个升序链表
  • 17 Kadane 算法
    • 17.1 最大子数组和
    • 17.2 环形子数组的最大和
  • 18 二分查找*
    • 18.1 搜索旋转排序数组
    • 18.2 寻找旋转排序数组中的最小值
    • 18.3 寻找两个正序数组的中位数
  • 19 堆
    • 19.1 IPO
    • 19.2 查找和最小的 K 对数字*
    • 19.3 数据流的中位数
  • 20 位运算
    • 20.1 颠倒二进制位
    • 20.2 只出现一次的数字 II
  • 21 数学
  • 21.1 阶乘后的零
  • 21.2 直线上最多的点数
  • 21 一维dp
    • 21.1 单词拆分
    • 21.2 零钱兑换
    • 21.3 最长递增子序列
  • 22 二维dp
    • 22.1 三角形最小路径和
    • 22.2 最小路径和
    • 22.3 不同路径 II
    • 22.4 最长回文子串
    • 22.5 交错字符串
    • 22.6 编辑距离
    • 22.7 买卖股票的最佳时机 III
    • 22.8 买卖股票的最佳时机 IV
    • 22.9 最大正方形

1 数组/字符串

1.1 文本左右对齐

题目大意, 给你一个字符串数组,按顺序排成若干行,每行最大宽度为maxWidth, 左右对齐,空格要尽可能均匀,如果无法
均匀,那么左侧空格大于右侧空格。 最后一行则要求左对齐。

考点: 字符串 字符串数组 模拟
难度: hard
相似题: 加油站
方法: 采用双指针slow, fast和一个cnt, cnt表示当前[slow,fast-1] 已经容纳的字母个数。不包含fast.
fast表示将要处理的字符串. 每次遇到的字符串,要么当前行能处理,要么处理不了。对于后者,可能有两种情况,一种是fast还没走完,但是加上这个字符串超过最大长度,要么就是如此fast已经走到n.  如此定义处理逻辑。 类似模拟。
class Solution {
public:
    vector fullJustify(vector& words, int maxWidth) {
        int n = words.size();
        int slow=0;
        int fast=0;
        int cnt=0;
        int ch_cnt=0;
        vector ans;
        //  fast表示将要处理的单词
        //  ch_cnt指[slow, fast-1]之间的单词长度之和,不包含fast指向的单词
        while(slowmaxWidth)){
                string tmp=words[slow];
                int remain = maxWidth-ch_cnt;
                if(fast==n){
                    for(int i=slow+1;i

2 双指针

3 滑动窗口

3.1 串联所有单词的子串

4 矩阵

5 哈希表

5.1 最长连续序列

6 区间

6.1 用最少数量的箭引爆气球

7 栈

7.1 基本计算器

class Solution {
private:
    map dict;
public:
    int calculate(string s) {
        dict['-']=1;
        dict['+']=1;
        int n = s.size();

        stack opNum;
//  处理形如-2+3这种,统一处理,避免特殊情况特判
        opNum.push(0);
        stack op;
//  去掉空格,必须做的
        string t="";
        for(int i=0;i='0'&&ch<='9'){
                    int num=0;
                    int j=i;
                    while(j='0'&&s[j]<='9'){
                        
                        num=num*10-'0'+s[j];
                        ++j;
                    }
                    opNum.push(num);
                    i=j-1;  // for循环会i++
                }else{
                    //  处理形如(+2  +-2 ++2 这种情况 
                    // +*3这种不符合语法, 不存在这种输入
                    if(i>0&&(s[i-1]=='('||s[i-1]=='+'||s[i-1]=='-')){
                        opNum.push(0);
                    }
                    while(!op.empty()&&op.top()!='('){
                        char s_ch = op.top();

                        // 栈顶的操作优先级一直小于或者等于
                        // 当前处理字符的优先级
                        if(dict[s_ch]>=dict[ch]){
                            calc(opNum, op);
                        }else{
                            break;
                        }

                    }
                    // 栈顶空了, 栈顶是(, 栈顶字符优先级大于处理字符优先级
                    op.push(ch);
                }
            }

        }
        while(!op.empty()&&op.top()!='(') calc(opNum, op);
        return opNum.top();

    }
    void calc(stack&opNum, stack & op){
        if(opNum.size()<2||op.empty()) return;
        int b = opNum.top();
        opNum.pop();
        int a = opNum.top();
        opNum.pop();
        char ch = op.top();
        op.pop();
        int ans;
        cout<

8 链表

8.1 k个一组翻转链表

8.2 LRU缓存

哈希表+双向链表。
4类变量:哈希表;双向链表虚拟头尾节点;cur_size; capacity
方法: get, put -----> removeNode, removeTail, addToHead

9 二叉树

9.1 二叉树的最近公共祖先

9.2 二叉树的直径

注意写的干净简洁

10 二叉树层次遍历

11 二叉搜索树

12 图

12.1 克隆图

12.2 除法求值

带权并查集

13 图的广度搜索遍历

13.1 蛇梯棋

非常好的模拟题

13.2 单词接龙*

字符串一定需要转化成数字Id吗?
一定需要邻接矩阵建立图吗?
一定需要邻接表建立图吗?

14 字典树

14.1 实现Trie树

14.2 添加与搜索单词 - 数据结构设计

14.3 单词搜索II*

15 回溯

15.1 组合总和

15.2 N皇后II

15.3 单词搜索

16 分治

16.1 将有序数组转换为二叉搜索树

16.2 排序链表

16.3 建立四叉树

16.4 合并 K 个升序链表

17 Kadane 算法

17.1 最大子数组和

17.2 环形子数组的最大和

18 二分查找*

18.1 搜索旋转排序数组

18.2 寻找旋转排序数组中的最小值

18.3 寻找两个正序数组的中位数

19 堆

19.1 IPO

19.2 查找和最小的 K 对数字*

19.3 数据流的中位数

20 位运算

20.1 颠倒二进制位

20.2 只出现一次的数字 II

21 数学

21.1 阶乘后的零

21.2 直线上最多的点数

21 一维dp

21.1 单词拆分

21.2 零钱兑换

21.3 最长递增子序列

22 二维dp

22.1 三角形最小路径和

22.2 最小路径和

22.3 不同路径 II

22.4 最长回文子串

22.5 交错字符串

22.6 编辑距离

22.7 买卖股票的最佳时机 III

22.8 买卖股票的最佳时机 IV

22.9 最大正方形

你可能感兴趣的:(算法,leetcode)