zoukankan      html  css  js  c++  java
  • leetcode刷题总结301-350

    301. 删除无效的括号

      描述:

        

       思路:遍历。通过BFS遍历,因为BFS可以立马判断当前是否为最短修改的有效符号,之后不用再进行下一层。

    303. 区域和检索 - 数组不可变

      描述:

        给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

        sumRange(0, 2) -> 1
        sumRange(2, 5) -> -1
        sumRange(0, 5) -> -3

      思路:开辟一个新数组存储0-i的和,然后0-j减去0-(i-1)为i-j的和

    304. 二维区域和检索 - 矩阵不可变

      描述:

        

       思路:类同。

    306. 累加数

      描述:

        输入: "199100199"
        输出: true
        解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199

      思路:遍历+回溯。

    307. 区域和检索 - 数组可修改

      描述:

        

       思路:线段树。先维护一个线段树。从叶子节点往根节点进行更新。

    309. 最佳买卖股票时机含冷冻期

      描述:

        输入: [1,2,3,0,2]
        输出: 3
        解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

      思路:动态规划。dp[i][k][state],第i天第k次交易当前处于买入卖出冷冻期的最大收益

    310. 最小高度树

      描述:

        

       思路:BFS效率太低。首先找到叶子节点,然后逐渐修建图,也就是剪掉叶子节点,知道图剩余两个或者1个。

    312. 戳气球

      描述:

        输入: [3,1,5,8]
        输出: 167
        解释: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
          coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167

      思路:动态规划。dp[i][j]表示从i剪刀j的最大数字。i~k~j。从右下开始,最后求左上。

    315. 计算右侧小于当前元素的个数

      描述:

        输入: [5,2,6,1]
        输出: [2,1,1,0]
        解释:
          5 的右侧有 2 个更小的元素 (2 和 1).
          2 的右侧仅有 1 个更小的元素 (1).
          6 的右侧有 1 个更小的元素 (1).
          1 的右侧有 0 个更小的元素.

      思路:从右往左构建二叉排序数。然后遍历。从根节点开始,若在右子树,那么计算左子树的个数,然后继续右子树查找,个数逐渐累积;;;;或者插入排序,插入位置寻找时通过二分,可以nlogn。

    316. 去除重复字母

      描述:

        

       思路:先统计每个数字出现的次数。然后通过栈,只要重复的数字不是最后一个,就往出弹,其目标是找到最小的那个字符出现。

    318. 最大单词长度乘积

      描述:

        输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
        输出: 16
        解释: 这两个单词为 "abcw", "xtfn"。

      思路:双重判断。用过set完成字符是否包含。

    321. 拼接最大数

      描述

        输入:
        nums1 = [3, 4, 6, 5]
        nums2 = [9, 1, 2, 5, 8, 3]
        k = 5
        输出:
        [9, 8, 6, 5, 3]

      思路:对k进行不同的划分,然后分而治之,对num1,num2分别求最大数,然后归并。求最大。

        在对nums求k-i的子序列使其最大的时候,需要用到栈。当栈顶元素小于下一个元素(需要丢弃元素的个数逐渐递减,需要判断>0),弹出栈顶元素同时压入新的元素。

    322. 零钱兑换

      描述;

        输入: coins = [1, 2, 5], amount = 11
        输出: 3
        解释: 11 = 5 + 5 + 1

      思路:贪心+乘法代替加法快速+回溯。(贪心:先用最大的面值,5*10》5+5+5+5.。。)

    324. 摆动排序 II

      描述:

        

      思路:找到排序后的中位数。不需要保证前面有序,后面有序。因此可以通过3分的快排,求出中位数。前面拿一个元素,后面那一个逐渐合并即可。

    328. 奇偶链表

      描述:

        

       思路:三个节点,交替。

    329. 矩阵中的最长递增路径

      描述:

        

       思路:开辟要给cache.存储【i】【j】的最长递增路径。当某个元素山下左右都大于他,那么词位置为1.然后遍历,cache用于记录并返回已经存下的数字即可。

    331. 验证二叉树的前序序列化

      描述:

        

       思路:从根节点开始检验左子树右子树是否为空,不空继续判断。

     332. 重新安排行程

      描述:    

        

       思路:深度优先,深度优先的时候需要判断相近节点的最小字母。

    334. 递增的三元子序列

      描述;

        

       思路:给定两个指针,用于存储当前元素下,第一小和第二小的元素,如果半路满足了递增,那么直接true.

    336. 回文对

      描述:  

        输入: ["abcd","dcba","lls","s","sssll"]
        输出: [[0,1],[1,0],[3,2],[2,4]]
        解释: 可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]

      思路:先按照输入反序存储trie。然后遍历。

    337. 打家劫舍 III、

      描述:

        

       思路:dp[i][0/1]存储当前元素偷/不偷的最大值。从叶子节点开始。

    338. 比特位计数

      描述:

        

       思路:判断下表是否为偶数,偶数右移等于dp【i>>1】的值。否则等于+1.

    341. 扁平化嵌套列表迭代器

      描述:

        

       思路:通过判断当前是否为列表继续深层次的迭代知道获取元素。

    343. 整数拆分

      描述:  

        

       思路:动态规划。通过dp[i]=max(dp[i], max (j*dp[i-j] , j*(i-j) )  )

    347. 前 K 个高频元素

      描述:

        

       思路:x先hashmap计数。然后维护一个K大小的小顶堆。来一个元素入堆,如果>k,那么弹出一个堆的元素,知道遍历完。

  • 相关阅读:
    js Validate
    JS
    JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari……
    自动搜索 下拉单
    有符号数和无符号数间的比较.
    结构体指针在函数调用中的实例
    如何计算时间复杂度
    指针和引用的比较
    指针参数是如何传递内存的
    fread函数和fwrite函数,read,write
  • 原文地址:https://www.cnblogs.com/dhName/p/13272805.html
Copyright © 2011-2022 走看看