优选算法——双指针专题7(单调性)

优选算法——双指针专题7(单调性)

                                                                 

🔥近津薪荼:个人主页

 🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》

✨有利的情况和主动的恢复,产生于‘再坚持一下’的努力之中


本期知识点导图:

1.上期参考代码

class Solution { public: vector<int> twoSum(vector<int>& price, int target) { int n=price.size(); int left=0; int right =n-1; while(left<right) { if(price[left]+price[right]==target) return {price[left],price[right]}; else if(price[left]+price[right]<target) left++; else right--; } return {};//找不到要返回空 } };

不会有人没敲出来吧

2.题目解析

三数之和(点击跳转)

要点:

去重

三元组的元素之和为0

随机数组找三元组

眼熟不

3解题思路:

3.1暴力解法

  • 先用sort接口将原数组排序
    当数组呈升序,方便后边的去重操作(重复元素相邻
  • 遍历所有三元组,找到满足条件的三元组,通过push_back接口,放到ret中去
  • 不管是暴力解还是优解,都要进行去重操作
class Solution { public: vector<vector<int>> hajiminanbeilvdou(vector<int>& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); vector<vector<int>> ret; for(int i = 0; i < n - 2; i++) { // 去重i if(i > 0 && nums[i] == nums[i-1]) continue; for(int j = i + 1; j < n - 1; j++) { // 去重j if(j > i + 1 && nums[j] == nums[j-1]) continue; for(int k = j + 1; k < n; k++) { // 去重k if(k > j + 1 && nums[k] == nums[k-1]) continue; if(nums[i] + nums[j] + nums[k] == 0) { ret.push_back({nums[i], nums[j], nums[k]}); } } } } return ret; } };

该解法的时间复杂度是O(N^3),会超时

3.2双指针解法

3.2.1.先排序

为了方便后面的去重以及双指针的遍历(都依赖于数组的单调性)

3.2.2找三元组:采用for+双指针(把时间复杂度干到O(N^2)

进入for循环,先固定一个数,然后取反

接下来就是找两数之和(O(N))的操作了:找两数之和等于取反之后的值

忘了的同学传送门在这里:两数之和

3.3.3去重

同暴力解法的去重操作思路相同,遍历时跳过相同元素

注意 

当出现极端情况,一直跳过相同元素,可能会造成数组访问越界,比如说数组长度为4,4个元素全是0,思考一下如何解决这个问题。

思路讲解就到这里了

劝敲:

本题一定一定要自己动手敲一遍,一是运用到的知识点包含了前两天的主要内容,起到复习巩固的作用,二是本题难度不大,但是很锻炼代码能力,所以大家自己动手写一遍,再看下一期的参考代码,特别是新手同学,不写的通通击毙

4.预告

下期要讲的题目是:

四数之和(点击跳转)

明天还会再见的,对吗

Read more

动态规划——分组背包(附带经典例题3个)

分组背包: 1.定义:给定一个整数m表示背包的容量,有n个货物可供挑选。每个货物有自己的体积,价值,组号。同一个组的物品只能挑选一件,所有挑选物品的体积总和不能超过背包容量。 怎么挑选货物能达到价值最大,返回最大价值。 2.dp[i][j]表示1~i组上,每组只能选一件商品(注意:i表示的是组,不是商品)容量不超过j的条件下的最大价值。 1)不要i组商品就满足条件——dp[i-1][j] 2)要i组商品,考虑要哪一件?全试!!! a:dp[i-1][j-a的体积]+a的价值 b:dp[i-1][j-b的体积]+b的价值 c:dp[i-1][j-c的体积]+c的价值 (注意:a,b,

By Ne0inhk
《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 13 水果成篮 题目链接: 编辑 题目示例: 解法(滑动窗口): 算法思路: 算法流程: C++代码演示:方法一(使用容器) C++代码演示:方法二(用数组模拟哈希表) 算法总结及流程解析: 结束语 13 水果成篮 题目链接: 题目示例: 解法(滑动窗口): 算法思路:       研究的对象是一段连续的区间,可以使用【滑动窗口】思想来解决问题。       让滑动窗口满足:窗口内水果的种类只有两种。       做法:右端水果进入窗口的时候,

By Ne0inhk
Flutter for OpenHarmony 实战:Material Color Utilities — 算法驱动的动态换肤

Flutter for OpenHarmony 实战:Material Color Utilities — 算法驱动的动态换肤

Flutter for OpenHarmony 实战:Material Color Utilities — 算法驱动的动态换肤 前言 随着 Flutter for OpenHarmony 进入全场景智慧时代,UI 的“个性化”与“自适应”成为了衡量应用质感的重要指标。Material Design 3 (M3) 引入了颠覆性的 动态颜色 (Dynamic Color) 系统,它可以从一张壁纸或用户的特定配色中提取出一整套和谐、对比度合格的主题。 你是否好奇:这些颜色是如何生成的?为什么生成的蓝色看起来既专业又不刺眼?答案就在 material_color_utilities 中。这是谷歌 M3 配色方案背后的核心算法库。本文将带你深入底层,由算法驱动鸿蒙应用的色彩革命。 二、M3 动态配色的核心黑科技 2.1 HCT

By Ne0inhk
优选算法《双指针》

优选算法《双指针》

在学习了C/C++的基础知识之后接下来我们就可以来系统的学习相关的算法了,这在之后的笔试、面试或竞赛都是必须要掌握的;在这些算法中我们先来了解的是一些非常经典且较为常用的算法,在此也就是优选出来的算法,接下来在每一篇章中我们都会来学习一种优选算法,并且在了解了算法原理之后接下来会通过几道算法题来巩固相应的算法原理。在每道算法题的讲解中都会通过题目解析——算法原理讲解——代码实现三步来带你完全吃透每道算法题,相信通过这一系列算法专题的学习,你的算法以及代码能力会有质的飞跃。接下来就开始本篇双指针专题算法的学习吧!!!  1.双指针算法 在之前数据结构链表和顺序表的学习当中我们就已经使用过了双指针的算法,就例如在删除数组当中的重复元素、判断一个链表是否为环、带环链表找出入环位置、找出链表的中间节点等算法题中我们就已经使用到双指针的算法思想,那么双指针的算法思想具体是什么呢?接下来就来详细的了解看看 常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。 对撞指针:一般用于顺序结构中,也称左右指针。 • 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐

By Ne0inhk