摘要:
考虑arr1可以取到的数字组合数,从0到i+1位置的合法的arr1组合数,可以从0到i的组合数得到。因此可以想到用动态规划解决问题,使用一个数组dp[i][j]代表arr1[i] = j时,前i + 1个数字有多少个组合。这样一来,最终的答案即为sum(dp[n-1][0...M],其中M为nums 阅读全文
摘要:
是思路题,其实能想到的话是很简单的。首先,用3243的图遍历搜索方法肯定是会超时的,然后注意到用例跟3243不一样的是,询问集合里没有交集,那么就可以定下一个策略"在有捷径就走捷径的情况下,答案是最优的",这个策略在该题里是正确的。 因此可以通过计算捷径覆盖的区域,然后用n-1减去这个区域的长度即可 阅读全文
摘要:
看了题目的两个初始用例,感觉能用前缀和和滑动窗口来解决,前缀和设定为从下标0到当前位置所有符合条件的答案数量,于是先写了一个: vector<long long> countKConstraintSubstrings(string s, int k, vector<vector<int>> &que 阅读全文
摘要:
一眼就知道是滑动窗口了,但是中间遇上了很多小问题一时没有转过弯来。。。 首先写一个朴素的滑动窗口来尝试一下 vector<int> resultsArray(vector<int> &nums, int k) { if (k == 1) return nums; int n = nums.size( 阅读全文
摘要:
记录一下写法,有时候百度文心一言出来的并不是很准确。 对于一个结构如: struct Point { double dX; double dY; double dZ; }; std::vector<Point> vecPoint; 随意的在其中插入一点数据后,有两种写法求解拟合平面方程参数。 用Qr 阅读全文
摘要:
题目要求输出结果为处理后数组的最大值与最小值之差。当同时增大或减小所有的数时,处理后的数组和原数组的答案是一样的,想要减小最终答案,需要对两类数字分别进行增大和减小。 由增大得到的最大值,与由减小得到的最小值两者组成的答案,才有可能比原数组中的答案要大。因此,最终得到的答案一定是由减小而得到的最大值 阅读全文
摘要:
一开始想的很简单,觉得在数组两端维护两个下标,用贪心的方法模拟取数字。 class Solution { public: int takeCharacters(string s, int k) { int left = 0, right = s.size() - 1; if(k == 0) retu 阅读全文
摘要:
根据题意,很容易就能想到用哈希表来做。先写一个最简单的暴力,完全就是模拟。 long long distinctNames(vector<string> &ideas) { int n = ideas.size(); unordered_map<string, int> um; for (int i 阅读全文
摘要:
由题目中求“最多可以连续运行的机器人数目”可知,求的是数组子数组的长度,那么就可以直接使用滑动窗口求解。配合前缀和,可以快速的求得滑动窗口内的运行时间和。那么编写代码如下: int maximumRobots(vector<int> &chargeTimes, vector<int> &runnin 阅读全文
摘要:
根据题意,暴力做法不可取,因为至少要对遍历位置之前的位置,以及不同的子序列阈值(跟k对应的那个)做循环。于是就能够想到使用动态规划的手段去解决问题,考虑需要保存的两个状态,当前序列末尾的数字、子序列阈值,设计一个二维的dp数组dp[i][j],其中i为位置索引,指代当前在nums数组中遍历的位置,j 阅读全文