草庐IT

【算法挨揍日记】day46——377. 组合总和 Ⅳ\、96. 不同的二叉搜索树

 377.组合总和Ⅳ377. 组合总和Ⅳ题目描述:给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合32位整数范围。解题思路:算法思路:⼀定要注意,我们的背包问题本质上求的是「组合」数问题,⽽这⼀道题求的是「排列数」问题。因此我们不能被这道题给迷惑,还是⽤常规的dp思想来解决这道题。1.状态表⽰:这道题的状态表⽰就是根据「拆分出相同⼦问题」的⽅式,抽象出来⼀个状态表⽰:当我们在求target这个数⼀共有⼏种排列⽅式的时候,对于最后⼀个位置,如果我们拿出数组中的⼀个数x,接下来就

【算法挨揍日记】day33——1027. 最长等差数列、446. 等差数列划分 II - 子序列

1027.最长等差数列 1027. 最长等差数列题目描述:给你一个整数数组 nums,返回 nums 中最长等差子序列的长度。回想一下,nums 的子序列是一个列表 nums[i1],nums[i2],...,nums[ik] ,且 0。并且如果 seq[i+1]-seq[i]( 0)的值都相同,那么序列 seq 是等差的。 解题思路:算法思路:1.状态表⽰:对于线性dp,我们可以⽤「经验+题⽬要求」来定义状态表⽰:i.以某个位置为结尾,巴拉巴拉;ii.以某个位置为起点,巴拉巴拉。这⾥我们选择⽐较常⽤的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表⽰:dp[i]表⽰:以i位置元素为结尾的

【算法挨揍日记】day16——525. 连续数组、1314. 矩阵区域和

 525.连续数组525. 连续数组 题目描述:给定一个二进制数组 nums ,找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。解题思路:本题的元素只有0和1,根据题目意思,我们可以把题目看成找一段最长的子区间使得区间的0和1的数量相同,我们可以对其优化将所有的0变成-1,这样这段区间的和就为0也就是转化为在【0,i-1】这个区间内最长的和为0的子数组我们依旧可以利用哈希表hash,我们还得处理一下默认前缀和为0的时候等于-1的时候 长度的计算:解题思路: classSolution{public:intfindMaxLength(vector&nums){unorde

【算法挨揍日记】day05——209. 长度最小的子数组、3. 无重复字符的最长子串

 209.长度最小的子数组209. 长度最小的子数组题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。解题思路:我们通过题目得知,本题是一个正数数列,题目要求求出最小连续子数组,假设子数组之和为sum假设从左到右,我们每加一个数,sum都是增大,每减一个数,sum都是减小,这就是具有单调性 所以我们可以用两个指针left和right(一开始都是在0的位置)来当做窗口的左右边界,

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词

 904.水果成篮904. 水果成篮题目描述:你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。一旦你走到某棵树前,但水果不符合篮子的水果类型,那

【算法挨揍日记】day04——15. 三数之和、18. 四数之和

  15.三数之和15. 三数之和https://leetcode.cn/problems/3sum/题目描述:给你一个整数数组 nums ,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i!=j、i!=k 且 j!=k ,同时还满足 nums[i]+nums[j]+nums[k]==0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。解题思路:我们先来看看题目:题目要求a+b+c=0,并且a、b、c三个数的下标各不相同,并且返回所有的可能性,并且要去重 我们首先可以确定一下大体思路:sort排序(有序),有序可以被双指针或者二分来

【算法挨揍日记】day02——双指针算法_快乐数、盛最多水的容器

 202.快乐数 202. 快乐数https://leetcode.cn/problems/happy-number/题目:编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是 无限循环 但始终变不到1。如果这个过程 结果为 1,那么这个数就是快乐数。如果 n 是 快乐数 就返回 true ;不是,则返回 false 。 解题思路: 我们先通过这两个测试用例来看看是什么情况 我们发现不管是19还是2都会形成一个环状结构(19的环状结构内都是1)那这样我们就可以使用快慢指针来操作!

【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

  611.有效三角形的个数611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/题目描述:给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。解题思路:本题是一个关于三角形是否能成立的题目,首先我们假设三角形的三边(a,b,c),我们要保证两边之和大于第三边  题目给我们nums是乱序的,如果我们一个个abc去实验就是会超时(时间复杂度O^3)当我们将sort排序一下,这样的话假设ac是否成立!这里我们遍历每个c(从后往前),这样时间复杂度就变成了N^2+NlogN也就是N^2解题代码:c