![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
进击的递归
I just wanna cry
展开
-
接雨水【leetcode高级--php版】
在此提供动态规划、单调栈、双指针三种解法:动态规划:以leftMax[i]表示i及其左边的高度最大值, 以rightMax[i]表示i及其右边的高度最大值,则点i处能接的雨水为 min($leftMax[$i], $rightMax[$i]) - $height[$i]; function trap($height) { $len = count($height); $leftMax = $rightMax = []; $leftMax[0] = $height[0]; $r..原创 2021-08-11 12:37:05 · 190 阅读 · 0 评论 -
根据身高重建队列【php版】
<?phpclass Solution { /** * Q: [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] * S: [[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]] * 解题思路:先将原队列按身高升序排列,相同身高的按前面比自己高的人数降序排列 * 然后我们再将排列好的元素放入到结果数组中,先放入的元素对后放入的元素没有影响, * 故在放元素[x,y]时,只须保证该元素前面有y个空位即可,这y个空位是留给身高比...原创 2021-08-10 19:27:12 · 107 阅读 · 0 评论 -
直线上最多的点数【php版】
思路:对于点A、B、C,如何确定三点共线呢?首先线段AB、AC的斜率是相同的,为了更好地比较,求出AB的横纵坐标之差dx,dy后,将其按最大公约数化简,然后我们,记一个key为"dx : dy",将其保存在一个map中,对应的value为2(表示该直线上已经有AB两个点了);同样地,我们对AC进行如上处理,如果key相同,则说明ABC在同一条直线上(它们有相同起点A),我们再将value+1;为了不重复计算,我们记同线的点的最大数目为max,我们遍历points,取位置为i的点为起点,0 &l...原创 2021-08-09 11:56:43 · 101 阅读 · 0 评论 -
最大数【php版】
原理: 如果xy大于yx, yz 大于 zy ,则xz一定大于zx,即具有传递性<?phpclass Solution { /** * @param Integer[] $nums * @return String */ function largestNumber($nums) { usort($nums, function($x, $y){ $baseX = $baseY = 10; while ($baseX <= $x) { $bas..原创 2021-08-06 14:51:04 · 85 阅读 · 0 评论 -
实现 Trie (前缀树)【php版】
<?phpclass Trie { private $_children; private $_isEnd; /** * Initialize your data structure here. */ function __construct() { $this->_children = []; $this->_isEnd = false; } /** * Inserts a word into the trie. * @param Strin...原创 2021-08-06 10:28:52 · 127 阅读 · 0 评论 -
LRU缓存机制【php版】
class LRUCache { private $_capacity; private $_size; private $_hashMap; private $_head; private $_tail; /** * @param Integer $capacity */ function __construct($capacity) { $this->_capacity = $capacity; $this->_size = 0; $this->...原创 2021-08-05 11:12:36 · 94 阅读 · 0 评论 -
戳气球【php版】
<?phpclass Solution { /** * 方法二: * 动态规划 * @param $nums */ function maxCoinsV2($nums) { $len = count($nums); $vals = new SplFixedArray($len+2); $dp = array_fill(0, $len+2, array_fill(0, $len+2, 0)); $i=1; foreach ($nums as $num) ...原创 2021-08-04 19:51:20 · 66 阅读 · 0 评论 -
单词拆分 II【php版】
<?phpclass Solution { private $memo = []; private $ans = []; /** * @param String $s * @param String[] $wordDict * @return String[] */ function wordBreak($s, $wordDict) { $dict = array_flip($wordDict); $this->deepSearch($s, 0, $di...原创 2021-08-04 16:50:23 · 132 阅读 · 0 评论 -
单词拆分【php版】
/** * 采用动态规划 * 记dp[i]表示s的前i个字符组成的字串是否满足题意, * 则 dp[i] = dp[j] & (s[j~i]在字典列表中) 0<=j<i * @param String $s * @param String[] $wordDict * @return Boolean */ function wordBreak($s, $wordDict) { $dictArr = array_flip($wordDict)...原创 2021-08-03 17:06:02 · 227 阅读 · 0 评论 -
完全平方数【php版】
这是一个完全背包问题,套用模板就好了 /** * 动态规划 * @param Integer $n * @return Integer */ function numSquares($n) { $dp = array_fill(0, $n+1, 0); for($i=1; $i<=$n; $i++) { $min = PHP_INT_MAX; for ($j=1; $j*$j<=$i; $j++) { $min = min($min, $...原创 2021-08-03 16:15:15 · 133 阅读 · 0 评论 -
最佳买卖股票时机含冷冻期【php版】
/** * 动态规划:记dp0表示前一天持有股票的最大收益、 * dp1表示前一天卖出股票的最大收益 * dp2表示前一天不持有股票的最大收益(不持有股票包括处于前天不持有股票和前天持有但卖出) * * @param Integer[] $prices * @return Integer */ function maxProfit($prices) { // 初始化,对于第一天而言 $dp0 = -$prices[0]; $dp1 = 0; $dp2 =...原创 2021-08-03 11:35:27 · 74 阅读 · 0 评论 -
乘积最大子数组【php版】
/** * 动态规划:因为乘积的特性,需要维护一个最大值与最小值,记max表示以上一个元素结尾的 * 子数组乘积的最大值, min表示以上一个元素结尾的子数组乘积的最小值。 * 当前元素为负值时,其乘以最小值min后的结果反而比较大,所以在乘之前先交换max与min的值 * @param Integer[] $nums * @return Integer */ function maxProduct($nums) { $max = 1; $min = 1; $a...原创 2021-08-03 10:38:26 · 117 阅读 · 0 评论 -
寻找两个正序数组的中位数【php版】
<?phpclass Solution { /** * @param Integer[] $nums1 * @param Integer[] $nums2 * @return Float */ function findMedianSortedArrays($nums1, $nums2) { $l1 = count($nums1); $l2 = count($nums2); $l = $l1 + $l2; if ($l % 2 == 1) { $a...原创 2021-08-02 15:51:49 · 141 阅读 · 0 评论 -
有序矩阵中第K小的元素【php版】
思路:利用小顶堆+ 排序n个有序列表的方法, 先将n个有序列表的第一项加入小顶堆,每次弹出堆顶元素,再将该元素所属列表的下一个元素放入小顶堆中。 function kthSmallest($matrix, $k) { $minHeap = new class() extends SplHeap { protected function compare($value1, $value2) { return $value2[0] - $value1[0]; } }; ...原创 2021-08-02 11:03:42 · 62 阅读 · 0 评论 -
摆动排序 II【php版】
class Solution { /** * 使用桶排序 * @param Integer[] $nums * @return NULL */ function wiggleSort(&$nums) { // nums中的元素 0<=n<=5000,所以造一个容量为5001的桶 $bucket = array_fill(0, 5001, 0); foreach ($nums as $num) { $bucket[$num]++; } ...原创 2021-08-02 10:17:16 · 63 阅读 · 0 评论 -
正则表达式匹配【php版】
function isMatch($s, $p) { $sLen = strlen($s); $pLen = strlen($p); $dp = array_fill(0, $sLen+1, array_fill(0, $pLen+1, false)); $isMatch = function ($s, $p, $i, $j) { if ($i==0) { return false; } return $p[$j-1] == '.' || $p[$j-1]...原创 2021-07-30 15:31:28 · 137 阅读 · 0 评论 -
通配符匹配【php版】
方法1:动态规划 /** * 方法1: 动态规划,令dp[i][j]表示,s[0~i-1] 与 p[0~j-1]是否匹配,对s、p而言,下标从0开始,而dp而言,下标表示第几个字符 * 状态转移方程为: * 1. 当p[j-1]不为"*"时 :当s[i-1] 与 p[j-1]相等 或 p[j-1]是 "?"时, dp[i][j] = dp[i-1][j-1]; * 2. 当p[j-1]为"*"时 : dp[i][j] = dp[i-1][j] || dp[i][j-1] 解析...原创 2021-07-30 10:27:57 · 549 阅读 · 0 评论 -
删除无效的括号【php版】
代码如下,注释已经很详尽,思路就是,先计算左右括号应该至少删除的数量,然后对于每一个位置的括号而言,可删可不删就有两种情况,递归回溯class Solution { private $ans = []; /** * @param String $s * @return String[] */ function removeInvalidParentheses($s) { $len = strlen($s); // 计算左右括号应该至少删除的数量 $leftRem...原创 2021-07-29 10:47:51 · 83 阅读 · 0 评论 -
单词搜索 II【php版】
前记: trie数据结构trie数据结构是基于各个序列前缀构造出来的查找树如这样的字符序列[‘oath’、‘dog’、‘dig’、‘dogs’];其构造的trie如下:构造代码如下:class TrieNode { public $children = []; public $word = null; public function __construct() {}}function buildTrie($words) { // root node $root = new .原创 2021-07-28 11:17:17 · 86 阅读 · 0 评论 -
分割回文串【php版】
class Solution { private $rlt = []; private $ans = []; private $dp = null; /** * 递归回溯+动态规划预处理 * @param String $s * @return String[][] */ function partition($s) { $len = strlen($s); // 使用动态规划预处理$s, 获得所有从i到j字串是否是回文字串的结果数组 $this->dp ...原创 2021-07-27 15:35:54 · 96 阅读 · 0 评论 -
计算右侧小于当前元素的个数【php版】
方法1: 树状数组动态维护前缀和 (关于什么是树状数组,网上介绍的有很多,这儿不作赘述) /** * 使用树状数组 * @param Integer[] $nums * @return Integer[] */ function countSmaller($nums) { $len = count($nums); if ($len == 0) { return []; } // 将nums中的元素去重再排序 $uniqueArr = []; fo...原创 2021-07-27 11:40:33 · 107 阅读 · 0 评论 -
矩阵中的最长递增路径【php版】
使用记忆化深度优先搜索<?phpclass Solution { private $dir = [ [0,1], [0,-1], [1,0], [-1,0], ]; // 用于记录已经搜索过的点的最大路径值 private $path = []; private $rCnt; private $cCnt; /** * @param Integer[][] $matrix * @return Integer */ function lo...原创 2021-07-26 17:03:07 · 69 阅读 · 0 评论 -
课程表【php版】
private $visited = null; private $edge = []; private $hasLoop = false; /** * 使用DFS+拓扑排序, 对于有向图的一个顶点而言,在搜索过程中有三种状态: * 1.未搜索 2.搜索中 3.已完成 * 当搜索到某个顶点时,其邻接顶点如果处于未搜索,则搜索邻接顶点,如果处于搜索中,则 * 说明图中存在回路,无法拓扑排序。如果所有邻接顶点处于已完成状态,则该顶点可自然加入拓扑 * 排序的上层,该顶点可标记为...原创 2021-07-26 13:12:45 · 793 阅读 · 0 评论 -
朋友圈——计算省份数量【php版】
三种方法:BFS 、 DFS 、并查集<?phpclass Solution { private $visited = []; private $parent = null; private $provCnt = null; /** * DFS * @param Integer[][] $isConnected * @return Integer */ function findCircleNum($isConnected) { $provCnt = c...原创 2021-07-26 12:30:40 · 90 阅读 · 0 评论 -
二叉树中的最大路径和【php版】
<?php/** * Definition for a binary tree node. * class TreeNode { * public $val = null; * public $left = null; * public $right = null; * function __construct($val = 0, $left = null, $right = null) { * $this->val = $v...原创 2021-07-26 11:44:36 · 112 阅读 · 0 评论 -
二叉树的最近公共祖先【php版】
使用递归法,公共祖先必然满足1.左子树包含p或q,且右子树包含p或q 或者 2. 本身是p, 左右子树中有一个包含q 3. 本身是q, 左右子树中有一个包含p ; 使用递归能保证,这个求出的祖先结点是最近的。<?php/** * Definition for a binary tree node. * class TreeNode { * public $val = null; * public $left = null; * public $rig...原创 2021-07-26 11:09:54 · 72 阅读 · 0 评论 -
被围绕的区域【php版】
此问题没什么难度,采用BFS和DFS都可以,从边界的’O’开始,将与之相连的’O’标记成另一种如’S’,最后再遍历整个矩阵,将’S’改为’O’,将’O’改为‘X’,即可。class Solution { private $dirs = [ [0, 1], [0, -1], [1, 0], [-1, 0], ]; /** * @param String[][] $board * @return NULL */ function solve(&...原创 2021-07-26 10:45:37 · 52 阅读 · 0 评论 -
单词接龙【php版】
方法1 ,BFS法(单向),通过添加虚拟结点建图class Solution { private $mpWord2inx = []; private $mpIdx2Edge = []; private $cntWords = -1; /** * BFS法(单向),通过添加虚拟结点建图,将每个单词看作一个点,如果两个单词间可以通过一个字符的变换来互换,则它们 * 之间存在一条边 * @param String $beginWord * @param String $endW..原创 2021-07-23 18:26:47 · 89 阅读 · 0 评论 -
复制带随机指针的链表【php版】
以下提供三种方法方法1 :先将所有结点copy一份,再遍历原链表,将next,random之类的指向还原方法2 :dfs法,有点类似方法1,但只遍历原链表一遍方法3 :迭代 + 节点拆分/** * Definition for a Node. * class Node { * public $val = null; * public $next = null; * public $random = null; * function __constru..原创 2021-07-23 15:48:37 · 59 阅读 · 0 评论 -
排序链表【php版】
/** * Definition for a singly-linked list. * class ListNode { * public $val = 0; * public $next = null; * function __construct($val = 0, $next = null) { * $this->val = $val; * $this->next = $next; * } * } ...原创 2021-07-23 12:01:08 · 110 阅读 · 0 评论 -
合并K个排序链表【php版】
链表的结构定义如下/** * Definition for a singly-linked list. * class ListNode { * public $val = 0; * public $next = null; * function __construct($val = 0, $next = null) { * $this->val = $val; * $this->next = $next; * ..原创 2021-07-23 10:42:07 · 80 阅读 · 0 评论 -
最小覆盖子串【php版】
/** * 使用滑动窗口标准模板解决即可 * @param String $s * @param String $t * @return String */ function minWindow($s, $t) { // 先统计目标字串中各字符的出现次数 $_tCount = array_count_values(str_split($t)); // $t 中不同字符的个数 $_tN = count($_tCount); $_sLen = strlen($...原创 2021-07-22 11:12:56 · 75 阅读 · 0 评论 -
滑动窗口最大值【php版】
/** * 使用单调队列法,队列中的元素是nums中元素的下标 单调递增 且其对应在nums中的值递减 * @param Integer[] $nums * @param Integer $k * @return Integer[] */ function maxSlidingWindow($nums, $k) { $deque = new SplDoublyLinkedList(); $len = count($nums); // 前k个元素先入队列 for ...原创 2021-07-21 10:40:26 · 128 阅读 · 0 评论 -
寻找重复数【php版】
三种方法:二分、位运算、快慢指针 /** * 方法一:二分法 假设重复的数字为target,对于[1,N]的数而言 ,整个nums中,[1,target-1]中的数i满足, 小于等于i的数的数目 * cnt[i] <= i , [target, N]中的数j满足, 小于等于j的数的数目 cnt[j] > j; * @param Integer[] $nums * @return Integer */ function findDuplicate($nums) {...原创 2021-07-20 14:29:36 · 162 阅读 · 0 评论 -
最长连续序列【php版】
使用动态规划法, mpVal2len数组中的元素 mpVal2len[i] = j表示 i 在原nums数组中的最长序列长度为j. $len = count($nums); if ($len == 0 || $len == 1) { return $len; } $mpVal2Len = []; $maxLen = 1; foreach ($nums as $num) { // 如果mapping中已经存在num,说明已经计算过了 if (array_key_..原创 2021-07-20 10:18:53 · 95 阅读 · 0 评论 -
生命游戏【php版】
不使用临时矩阵,利用原矩阵,为了不影响后续判断,使用-1表示细胞由活->死,使用2表示细胞由死->活 function gameOfLife(&$board) { $_move = [0, -1, 1]; foreach ($board as $rowIndex => &$rowData) { foreach ($rowData as $colIndex => &$cell) { $_lifeCount = 0; fo...原创 2021-07-19 10:52:09 · 84 阅读 · 1 评论 -
缺失的第一个正数【php版】
function firstMissingPositiveV2($nums) { for ($i=0, $len=count($nums); $i<$len; $i++) { // 还原数组法,利用原数组来存储各正数的存在信息 while ($nums[$i] > 0 && $nums[$i] <= $len && $nums[$i] !== $nums[$nums[$i]-1]) { // 我们只关心范围在[1,N]里的正数...原创 2021-07-19 10:46:48 · 70 阅读 · 0 评论 -
盛最多水的容器 【php版】
/** * 思路:使用双指针法,两个指针分别指向数组的两端,代表area的边界,每次取值较小的那个 * 指针向中心移动,然后计算每次移动后area的值,取最大者 * @param Integer[] $height * @return Integer */ function maxArea($height) { $left = 0; $right = count($height) - 1; if ($left >= $right) { return 0;...原创 2021-07-16 10:17:50 · 110 阅读 · 0 评论 -
四数相加 【php版】
思路: 使用hash table降低循环的层数, 先计算前两个数组中两个元素的和,并用数组记录值与出现次数,再处理后两个数组。 function fourSumCount($nums1, $nums2, $nums3, $nums4) { $_sumCount = []; foreach ($nums1 as $num1) { foreach ($nums2 as $num2) { $_sum = $num1 + $num2; if (isset($_sumCoun...原创 2021-07-16 09:57:39 · 102 阅读 · 0 评论 -
螺旋矩阵【php版】
思路:模拟遍历的过程,每次访问的正好是按螺旋顺序应该访问的元素,共访问 m* n次 function spiralOrder($matrix) { $rows = count($matrix); $cols = count($matrix[0]); if ($rows == 0 || $cols == 0) { return []; } $count = $rows * $cols; $visited = array_fill(0, $rows*$cols, false..原创 2021-07-15 15:42:32 · 95 阅读 · 1 评论