千山万水总有路,勇敢迈出第一步!!!前路很难,路已过半,何言弃,言何弃
>> 算法的魅力,在于即使,知识你门清,题目给你一闷棍。
<< 有形的代码,被无形算法来回拉扯,翻滚吧,我的脑浆。
今日套餐【4 橙 5 绿 】。休息很重要,昨天 1点30 睡觉,早上 6点30 醒,困倦 + 暴躁呀 ~
绿题 1827 一次过,代码好优雅。橙题 945 想了一下,觉得肤浅了,肯定不会~ 晚上在群里,大家一点拨,一气呵成 + 注释 + 通过 🤦🤦🤦
一、吹逼 反省
今日学习内容:https://bbs.youkuaiyun.com/topics/605702199
脑子是个好东西,我有,我得好好用 ~
又是 排序 + 双指针 得一天呀。
今日最 “牛”,611. 有效三角形的个数 👈 算你狠
双指针,核心理念:左右指针,相向而行,相遇即终止 👇
二、晒战绩
话不多说,上图~ 👆
三、写解题报告
题解报告,只写让我有
的那道题!
>> 算法的魅力,在于即使,知识你门清,题目给你一闷棍。
<< 有形的代码,被无形算法来回拉扯,翻滚吧,我的脑浆。
上点,让我彻夜难眠的 👇
1913. 两个数对之间的最大乘积差:题目意图 → 上个,两行的,找找自信
class Solution {
public:
int maxProductDifference(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size()-1]*nums[nums.size()-2]-nums[0]*nums[1];
}
};
945. 使数组唯一的最小增量:题目意图 → 上个,感觉不会,其实我会的
class Solution {
public:
int minIncrementForUnique(vector<int>& nums) {
int ans = 0;
sort(begin(nums), end(nums));
for(int i=1; i<nums.size(); i++) {
// 排序后每一项满足的是:nums[0] <=... nums[i-1] <= nums[i] <= ... nums[N-1]
// 遍历时为保证递增,元素值会变大,可能导致 nums[i-1] > nums[i]
if(nums[i] <= nums[i-1]) { // 若 当前元素小于等于 前一项,修正为大于前一项
// 最小的增量要保证当前元素比前一项大 1,即 差值 + 1
int dis = nums[i-1] - nums[i] + 1;
// 更新当前元素值 和 ans
nums[i] += dis;
ans += dis;
}
}
return ans;
}
};
324. 摆动排序 II:题目意图 → 上个,你以为是排序,其实还可以这样的
class Solution {
public:
void wiggleSort(vector<int>& nums) {
int N = nums.size();
if(N==1) return;
sort(begin(nums), end(nums));
vector<int> ret(nums); // 将 nums 深拷贝到 ret 中
int r = N-1;
// 先插奇数位,再插偶数位。请拿笔 画一下 👇
for(int i = 1; i < N; i+=2) nums[i] = ret[r--];
for(int i = 0; i < N; i+=2) nums[i] = ret[r--];
}
};
611. 有效三角形的个数:题目意图 → 上个,让我迷路彷徨的,证明我肯定行的
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int n = nums.size();
if(n<3) return 0; // 构不成三角形
int ans = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < n; i++) {
// 双指针扫描,j ... k 之间,有多少满足
int k = i;
for (int j = i + 1; j < n; j++) {
while (k + 1 < n && nums[k + 1] < nums[i] + nums[j]) {
k++;
}
ans += max(k - j, 0);
}
}
return ans;
}
};
四、写给明天
多美美好的一天呀~~ 喜刷刷,喜刷刷 😀😀😀 喜刷刷 刷刷~ 😀😀😀 ~
疫情来了,我要被包围了,还好,我有算法和你们 ~ 谁说不是呢