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,那么弹出一个堆的元素,知道遍历完。

 

posted @ 2020-07-09 11:47  _Meditation  阅读(173)  评论(0编辑  收藏  举报