【每日刷题】Day105

news2025/1/13 10:29:03

【每日刷题】Day105

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

2. 904. 水果成篮 - 力扣(LeetCode)

3. 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

1. 1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

//思路:滑动窗口。

//本题如果按照题目的思路去数组两边寻找数让x能够减为0那么会非常困难,从题目所给的示例就可以看出:有时候我们一直在数组右边找数组,有时候我们一会儿在数组左边找,一会儿在数组右边找,有时候甚至左右都找不到。

//既然如此,我们果断放弃从正面求解的思路,根据 "正难则反" 思想,我们试试从反面如何求解:

class Solution {

public:

    int minOperations(vector<int>& nums, int x)

    {

//target初始为-x,后续遍历数组直接将target += 数组中的所有元素 就能求出 sum - x

        int left = 0,right = 0,target = -x;

        for(int i = 0;i<nums.size();i++)

        {

            target+=nums[i];

        }

//因为数组中的值全都是>0的,因此如果target<0我们不可能找到一个区间的和等于target,直接返回-1

        if(target<0) return -1;

        int max = -1;

//后面思路与 Day103 中 "长度最小的子数组" 这道题一样

        while(right<nums.size())

        {

            target-=nums[right++];

            while(target<0)

            {

                target+=nums[left++];

            }

            if(target==0)

                max = max>(right-left)?max:(right-left);

        }

        if(max==-1) return -1;

        else return nums.size()-max;

    }

};

2. 904. 水果成篮 - 力扣(LeetCode)

//思路:滑动窗口。

//本题我们依旧是在暴力遍历的基础上进行优化,优化的最终结果就是滑动窗口。

//先来看看暴力解法的思路:

//下面来进行优化:

//从上面暴力遍历我们仔细思考可以发现,当我们第一轮遍历结束后是让left++。但是left++还是到3的位置,因此right还是会在2的位置停下来。

//再下一轮left++还是指向3,right还是会在2的位置停下来。

//优化:我们可以在一轮结束后,不让left++,而是让left直接跳过相同的元素:

//但是,光有上面的优化本题的速度还是很慢,那我们还可以怎么优化呢?

class Solution {

public:

    int totalFruit(vector<int>& fruits)

    {

        int ans = 0,j = 0,i = 0;

        for(;i<fruits.size();)

        {

//stack代表两个篮子

            int stack[2] = {-1,-1};

            int num = 0,j = i;

            while(j<fruits.size())

            {

//情况一

                if(num==0||(num>0&&num<2&&fruits[j]!=stack[num-1])) stack[num++] = fruits[j++];

//情况二

                else if (fruits[j]==stack[0]||fruits[j]==stack[1]) j++;

//情况三

                else

                {

                    ans = ans>(j-i)?ans:(j-i);

                    break;

                }

                ans = ans>(j-i)?ans:(j-i);

            }

//优化一:跳过相同数字

            i++;

            while(i<fruits.size()&&fruits[i]==fruits[i-1])

            {

                i++;

            }

//优化二:判断数组剩余长度

            if(ans>fruits.size()-i) break;

        }

        ans = ans>(j-i)?ans:(j-i);

        return ans;

    }

};

3. 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

//解法一:朴素二分查找+双向暴力遍历。(可以解决问题,但不符合题意,O(N))

//首先二分查找将mid定位到等于target值的位置

//定位好后让left和right都指向mid,向两边遍历。

//left遍历:当left>0并且left == target,left向前找target第一次出现的位置

//right遍历,当right+1<数组长度并且right == target,right向后找target最后一次出现的位置

class Solution {

public:

    vector<int> searchRange(vector<int>& nums, int target)

    {

        vector<int> ans = {-1,-1};

        int left = 0;

        int right = nums.size()-1;

        while(left<=right)

        {

//二分查找

            int mid = left+(right-left)/2;

            if(nums[mid]<target) left = mid+1;

            else if(nums[mid]>target) right = mid-1;

//当mid定位到与target相同的值时,left和right都指向mid,开始向两边查找

            else

            {

                left = right = mid;

                while(left>0&&nums[left]==target&&nums[left-1]==nums[left])

                {

                    left--;

                }

                       while(right+1<nums.size()&&nums[right]==target&&nums[right]==nums[right+1])

                {

                    right++;

                }

                ans[0] = left;

                ans[1] = right;

                break;

            }

        }

        return ans;

    }

};

//解法二:二段性二分查找

//朴素的二分查找我们只能在有序数组中查找某一个数。但是本题显然是让我们查找某个数出现的区间,也就是这个数第一次和最后一次出现的位置,那么使用朴素的二分查找显然是没法解决问题的。

//这里我们利用单调数组的二段性来解决这个问题,什么是二段性?

class Solution {

public:

    vector<int> searchRange(vector<int>& nums, int target)

    {

        vector<int> ans = {-1,-1};

        if(!nums.size()) return ans;

        int left = 0;

        int right = nums.size()-1;

        while(left<right)//查找左端点

        {

            int mid = left+(right-left)/2;

//情况①

            if(nums[mid]<target) left = mid+1;

//情况②

            else right = mid;

        }

//这里需要判断一下是否找到了target

        if(nums[left]==target) ans[0] = left;

        else return ans;

        right = nums.size()-1;

        while(left<right)//查找右端点

        {

            int mid = left+(right-left+1)/2;

//情况①

            if(nums[mid]>target) right = mid-1;

//情况②

            else left = mid;

        }

        if(nums[right]==target)

            ans[1] = right;

        return ans;

    }

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

File的常见成员方法(获取并遍历)

一.File的常见成员方法&#xff08;获取并遍历&#xff09;&#xff1a; 二.代码实现&#xff1a; 1.D盘下的JavaTest文件夹为&#xff1a; 2.执行listFiles方法后&#xff1a; package com.itheima.a01myfile; ​ import java.io.File; ​ public class FileDemo6 {public s…

es的学习

1.认识es 2.ik分词器 对于某些词进行特定分词设置或者忽略设置 3.索引库的操作 就是相当于操作表 4.文档的操作 就是相当于操作数据

[windows][apache]Apache代理安装

下载apache服务软件和VC_redist安装包 https://www.apachelounge.com/download/ https://www.microsoft.com/zh-CN/download/details.aspx?id48145 解压文件&#xff0c;修改httpd.conf文件 37行出修改文件的解压目录 60行修改监听端口 安装服务 进入apache的目录&#xf…

windows系统蓝屏怎么办_Windows系统蓝屏原因查找及解决方法

电脑蓝屏怎么办&#xff1f;windows蓝屏是十分常见的故障&#xff0c;也是十分难以解决的问题&#xff0c;例如软件冲突兼容性问题、系统补丁bug、超频不当、系统文件损坏、硬件驱动兼容性、虚拟内存设置不当、电脑硬件温度过高、内存硬盘等硬件损坏、内存松动等均可能造成电脑…

2024年8月22日嵌入式学习

今日主要学习网络知识 udp recvfrom ssize_t recvfrom(int sockfd, //socket的fd void *buf, //保存数据的一块空间的地址 size_t len, //这块空间的大小 int flags, // 0 默认的接收方式 --- 阻塞方式…

克服编程学习中的挫折感:从心态到策略的全方位指南

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、心态调整&#xff1a;积极乐观&#xff0c;合理期望 二、学习方法&#xff1a;有效策…

js中的字符串的length的知识点。

unicode字符集 unicode字符集是对世界上绝大部分字符进行编码&#xff0c;一个字符对应一个编码&#xff0c;范围&#xff1a;0x0000-0x10FFFF,可以表示一百多万个字符&#xff0c;其中0x0000-0xFFFF的字符为BMP&#xff08;基本多语言平面字符集&#xff09;&#xff0c;剩余…

【大模型从入门到精通34】开源库框架LangChain 利用LangChain构建聊天机器人1

这里写目录标题 利用LangChain构建聊天机器人介绍介绍对话型聊天机器人构建环境环境变量和平台设置 加载文档和创建向量存储高级检索技术对话上下文和记忆纳入聊天历史会话缓冲内存 构建对话检索链环境设置与API密钥配置选择合适的语言模型版本Q&A系统设置 利用LangChain构…

无人机之喊话器的用途

无人机喊话器&#xff0c;俗称无人机扬声器&#xff0c;其用途广泛且多样化&#xff0c;主要体现在以下几个方面&#xff1a; 一、应急救援与指挥 紧急响应与指挥&#xff1a;在自然灾害&#xff08;如山洪、火灾、地震等&#xff09;或突发事件发生时&#xff0c;无人机搭载喊…

iOS App上架审核被拒——2.3.3 - Performance - Accurate Metadata

iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata 噢&#xff0c;又被拒了… 文章目录 iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata被拒原因解决 被拒原因 大概翻译了下&#xff1a;预览图问题&#xff0c;只因某张预览图加了…

前端开发攻略---在Vue3项目中修改Element-Plus主题色

1、演示 2、安装依赖 npm i use-element-plus-theme -d 3、使用 import { useElementPlusTheme } from use-element-plus-theme const { changeTheme } useElementPlusTheme()const changePrimaryColor () > {// 传入颜色changeTheme(red) } 4、演示代码 <templa…

[godot] 采用状态机时,如何处理攻击时移动?如“冲撞”

这里以‘史莱姆撞击’为例子&#xff0c;将‘空中跃进’定义为伤害帧。&#xff08;见下图&#xff09; 先梳理流程&#xff1a;a.史莱姆原地蓄力(起跳准备)--->b.跳起并移动一段距离(空中跃进)--->c.落地调整 一 当状态机进入‘攻击状态’时&#xff0c;在enter()中…

day40——数据库 sqlite3

1 安装sqlite3数据库以及sqlite3函数库 1&#xff1a;sudo apt install sqlite3 //安装数据库 2&#xff1a;sudo apt install libsqlite3-dev // 安装数据库的函数库 2 什么是数据库 一种存放数据的文件&#xff0c;但是该文件拥有特殊的结构 第一层结构&#xff1a;数据…

存储数据(常量)

常量&#xff1a;用来存储数据&#xff08;不可变&#xff09; 常量不能修改 //常量 const PI:number 3.14 const Name: string "啦啦啦" console.log(名字,Name) console.log(π等于,PI)前面带 后面不带&#xff0c;不然就是打印字符串了

PHPShort轻量级网址缩短程序源码开心版,内含汉化包

需要网址缩短并且想获得更多有关链接点击率和流量的数据分析&#xff0c;那么 PHPShort 可能是一个非常好的选择。PHPShort 是一款高级的 URL 缩短器平台&#xff0c;可以帮助你轻松地缩短链接&#xff0c;并根据受众群体的位置或平台来定位受众。 该程序基于 Laravel 框架编写…

算法——不得不磕!

OK,首先一个小问题——你知道国际大厂通用的筛人方法是什么吗&#xff1f;...... 只有两个&#xff1a; ①算法 Algorithm ②系统设计 SystemDesign 如果你在美国、加拿大&#xff0c;是应届生想找份工作&#xff0c;那么你其它什么都不用考&#xff0c;单单只考算法就够了。至…

科研绘图系列:Python语言时间趋势图

介绍 不同指标在时间上的变化,可以用时间序列线图表示趋势。 加载Python包 import sys import pandas as pd import numpy as np import scipy as sp from scipy import stats import randomimport seaborn as sns import matplotlib.pyplot as plt from matplotl

JavaScript(30)——解构

数组解构 数组解构是将数组的单元值快速批量赋值给一系列变量的简洁语法 基本语法&#xff1a; 赋值运算符左侧的[]用于批量声明变量&#xff0c;右侧数组的单元值将被赋值给左侧变量变量的顺序对应数组单元值的位置依次进行赋值操作 const arr [1, 2, 3, 4, 5]const [a, b…

教育部-华为产学合作协同育人项目 | 仓颉编程语言专项

为响应《教育部高等教育司关于调整产学合作协同育人项目运行模式及征集2024年产学合作协同育人项目的通知》号召&#xff0c;华为公司2024年第二批70个项目已发布&#xff0c;其中仓颉编程语言领域共计10个项目&#xff0c;如下所示&#xff0c;通过新工科建设项目&#xff0c;…

Apache CloudStack Official Document 翻译节选(六)

关于 Apache CloudStack 的 概念和专用术语 &#xff08;六&#xff09; Multi-Site Deployment Apache CloudStack可以通过使用多个专职地带&#xff08;即多数据中心&#xff09;扩展为多局点模式。下面的示意图就是一个多局点部署Apache CloudStack的示例。 下图中的数据中…