算法
巧啡豆
我好菜呀~~~
展开
-
211、最大正方形
题目:在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。思路:本题中的输入数组是 char 类型的二维数组,时刻记得看题目。采用动态规划,使用 dp[][] 数组,大小和输入数组一样。里面记载的是以当前位置为正方形的右下角的正方形边长。所以,每个位置的值有以下几种情况:如果该位置是 0,则肯定不能组成正方形,直接把对应 dp 数组的值置为 0。如果该位置是 1,则能组成最大的正方形,取决于上、下,左斜上方位置中 dp 最小的那个,加一。dp(i原创 2021-11-28 20:35:00 · 103 阅读 · 0 评论 -
207、课程表
题目:你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例 1:输入:原创 2021-11-27 19:44:53 · 192 阅读 · 0 评论 -
力扣算法155、最小栈
题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。思路:栈中最小的元素要能在常数时间内找到,需要用空间换时间。可以设置一个辅助栈,记录以当前数为栈顶时,栈中最大数是多少。因为 java 中数组在创建时大小就被定下来了,如果使用数组模拟栈,还需要做一个扩容检测的方法,比较繁琐。所以自己创建一个结点,使用原创 2021-11-22 21:53:36 · 367 阅读 · 0 评论 -
力扣(LeetCode)152、乘积最大子数组
题目:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。思路:此题和 53 题十分相似,但是不能统一而论。在 53 题中,定义一个dp[],表示是以当前数为结尾的最大子序和。而此题的关键就是,不知道当位置上的是正数还是负数。如果当前数为正数,则前一个数的dp[]最大乘积越大越好。如果为负数,则越小越好。所以,我们直接使用两个数组,分别保存前一个数为结尾的最大子序乘积和最小子序乘积。这样,我们在判断当前数的时候,就直接从num[i]原创 2021-11-22 12:07:11 · 244 阅读 · 0 评论 -
力扣(LeetCode)148、排序链表(包含21、合并两个有序链表)
148、排序链表(包含21、合并两个有序链表)题目:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 进阶:你可以在 O(n logn) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?思路:对于链表的排序在o(n logn)这个级别下,可以使用归并排序。归并排序:将数组从中递归的分成两部分,直到每部分只有一个数。将这两个数有序排列,随后回归,变成两个有序链表的有序排列。分成两步:将链表递归的分成两部分(找到链表的中间结点,使用快慢指针)将左右两部分进行原创 2021-11-22 10:49:48 · 385 阅读 · 0 评论