滑动窗口系列(同向双指针)/9.7

news2024/9/20 9:08:41

新的解题思路

一、三数之和的多种可能

给定一个整数数组 arr ,以及一个整数 target 作为目标值,返回满足 i < j < k 且 arr[i] + arr[j] + arr[k] == target 的元组 i, j, k 的数量

由于结果会非常大,请返回 109 + 7 的模。

输入:arr = [1,1,2,2,3,3,4,4,5,5], target = 8
输出:20
解释:
按值枚举(arr[i], arr[j], arr[k]):
(1, 2, 5) 出现 8 次;
(1, 3, 4) 出现 8 次;
(2, 2, 4) 出现 2 次;
(2, 3, 3) 出现 2 次。
思路:

使用一个for循环,固定起点。相向双指针比较复杂,因为会有相同的数的情况被忽略掉。

所以使用单指针+哈希表判断。for循环+单指针已经固定了两个数。只需要判断map中是否存在target-a-b.如果存在,res+=map.get(target-a-b); 然后把单指针指向的数字放进去。

代码:
class Solution {
    public int threeSumMulti(int[] arr, int target) {
        int res=0;
        for(int i=0;i<arr.length-2;i++){
            int num=arr[i];
            HashMap<Integer,Integer> map=new HashMap<>();
            int left=i+1;
            while(left<arr.length){
                int other=target-num-arr[left];
                res=(res+map.getOrDefault(other,0))%(int)(1e9+7);
                map.put(arr[left],map.getOrDefault(arr[left],0)+1);
                left++;
            }
        }
        return res;
    }
}

二、令牌放置

题意:

给定一个数组tokens[],里面装了下标为i的令牌的值,并且给定一个power,表示你的能量;

如果你的power>token[i]的,你可以利用power换取一个积分;

你也可以使用积分,去换取能量;你的目标是通过有策略地使用这些令牌以 最大化 总 分数

在使用 任意 数量的令牌后,返回我们可以得到的最大 分数 。

思路:

贪心策略:如果我们使用tokens[i]值小的令牌换取积分。然后用tokens[i]值大的换取能量。这样就可以使积分最大化。

1.首先进行排序

2.如果能量够的话,就换积分(这样是最划算的);能量不够的话,并且有积分,换取能量;其他情况就直接break(因为你的积分也不够,能量也不足以换取积分)

代码:
class Solution {
    public int bagOfTokensScore(int[] tokens, int power) {
        //贪心策略:如果能量够的话 就得分。不够的话 看看有没有分 换能量
        Arrays.sort(tokens);
        int res=0;
        int left=0;
        int right=tokens.length-1;
        int score=0;
        while(left<=right){
            if(power>=tokens[left]){
                score++;
                power-=tokens[left++];
                res=Math.max(res,score);
            }else if(score>0){
                score--;
                power+=tokens[right--];
            }else{
                break;
            }
        }
        return res;
    }
}

三、分割两个字符串得到回文串

题意:

给定两个子串a,b;在相同的下标位置切割子串得到,preA sufA; preB sufB。

看preA+sufB或者preB+sufA能否构成回文串。

思路:

  因为题目中要求是从相同的下标位置处切割。所以要找到能和b串后缀构成回文串的a串的最大前缀;(也就是图片中红色的位置)。

如果红色的位置越多,那么剩余部分判断回文串的长度就小了。

所以贪心的策略为:

1.尽可能多的去匹配a串前缀和b串的后缀

    public boolean checkPalindromeFormationHelp(String a,String b){
        int left=0;
        int right=b.length()-1;
        int len=0;
        while(left<right&&a.charAt(left)==b.charAt(right)){
            left++;
            right--;
        }
        return idPalindrome(a,left,right)||idPalindrome(b,left,right);
    }

2.然后看剩余的部分是否是回文子串。

    public boolean idPalindrome(String s, int left, int right) {
        while(left<right&&s.charAt(left)==s.charAt(right)){
            left++;
            right--;
        }
        return left>=right;
    }
代码:
class Solution {
    public boolean checkPalindromeFormation(String a, String b) {
        // a前b后或者a后b前
        return checkPalindromeFormationHelp(a, b) || checkPalindromeFormationHelp(b, a);
    }

    public boolean checkPalindromeFormationHelp(String a,String b){
        int left=0;
        int right=b.length()-1;
        int len=0;
        while(left<right&&a.charAt(left)==b.charAt(right)){
            left++;
            right--;
        }
        return idPalindrome(a,left,right)||idPalindrome(b,left,right);
    }

    public boolean idPalindrome(String s, int left, int right) {
        while(left<right&&s.charAt(left)==s.charAt(right)){
            left++;
            right--;
        }
        return left>=right;
    }
}
说明:

第一个函数中的||,是拿a还是b的前缀就行匹配。

第二个函数中的||,xxxxx

两个是不冲突的。

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

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

相关文章

AMEYA360:村田量产用于汽车市场的高可靠性0603M铜电极负温度系数NTC热敏电阻

株式会社村田制作所开发了0603M尺寸(0.60.30.3mm)铜电极负温度系数(NTC)热敏电阻&#xff0c;型号分别是“NCU03XH103F6SRL”和“NCU03XH103F60RL”&#xff0c;该新品扩充了NCU系列的产品尺寸阵容&#xff0c;满足了汽车市场应用中电路板的高密度化和小型化、以及对电子部件的…

AF路由模式组网部署

实验拓扑 防火墙基本配置 接口配置 eth1 eth2 eth3 路由配置 地址转换配置 放通策略 1. 出口申请了主电信、备联通两条外网线路&#xff08;均为 50M 带宽&#xff09;。 2. 内网有 web 服务器linux 172.16.3.100运行 http 服务&#xff0c;内外网用户通过 出口路由器…

Kubernetes 1.25 containerd 环境部署 SuperMap iManager

超图官网目提供的Kubernetes 版本为 1.20 版本&#xff0c;容器运行时为 docker 本次部署使用已有的 Kubernetes 1.25 版本集群&#xff0c;容器运行时为 containerd Kubernetes &#xff0c;containerd 部署请自行了解&#xff0c;本次不做介绍&#xff0c;下面介绍在此环境上…

MATLAB绘图基础5:MATLAB数据导入

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 5.MATLAB数据导入 5.1 从CSV文件读取数据 C S V {\rm CSV} CSV文件是一种纯文本文件&#xff0c;文件中的数据以逗号为分隔符进行字段分隔&#xff0c;每一行数据代表一条记录&#xff0c;每…

通信工程学习:什么是AB地址总线、DB数据总线、CD控制总线

AB地址总线、DB数据总线、CD控制总线 在计算机体系结构中&#xff0c;总线&#xff08;Bus&#xff09;是一种用于在计算机内部各个组件之间传输信息的物理通道。其中&#xff0c;AB地址总线、DB数据总线和CD控制总线是计算机总线系统中非常重要的三个组成部分&#xff0c;它们…

机器学习-神经网络:循环神经网络(RNN)详解

引言 在当今人工智能(AI)和深度学习(DL)领域,循环神经网络(RNN)作为一种专门处理序列数据的模型,具有不可忽视的重要性。RNN 的设计目标是模拟和处理序列中的时间依赖关系,使其成为许多应用场景的理想选择,如自然语言处理(NLP)、时间序列预测和语音识别等。它不仅…

乐凡北斗车载终端 | 车载终端功能是什么?

北斗车载终端即北斗卫星监控系统主机&#xff0c;主要是通过北斗卫星实现定位和导航&#xff1b;并通过传输网络与监控中心通信&#xff0c;由前端设备、传输网络、监控中心构成北斗卫星定位监控系统&#xff0c;实现定位跟踪及智能功能, 终端还可内置8Mbit的Flash储存器&#…

分享一个基于uniapp科技馆服务微信小程序 博物馆管理小程序(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

Java stream使用与执行原理

stream简介 Stream: A sequence of elements supporting sequential and parallel aggregate operations stream为sequential即单线程串行操作&#xff0c;parallelStream支持并行操作&#xff0c;本文只讨论sequential的stream。 stream常用操作 Datastatic class Course {pr…

【软件工程】第二讲软件过程

【软件工程】第二讲软件过程 文章目录 【软件工程】第二讲软件过程1. 软件过程概述1.1 软件工程的金三角1.2 软件过程的定义1.3 软件过程的组成 2. 软件生命周期模型2.1 瀑布模型2.2 增量模型2.3 演化模型 3. 统一软件过程RUP3.1 RUP最佳实践3.2 统一软件过程RUP 4. 敏捷过程4.…

Qt-常用控件(2)-按钮类和显示类

​ 1. QPushButton 使用 QPushButton 表示一个按钮.这也是当前我们最熟悉的一个控件了 QPushButton 继承自 QAbstractButton.这个类是一个抽象类.是其他按钮的父类 在 Qt Designer中也能够看到这⾥的继承关系 QAbstractButton 中,和 QPushButton 相关性较⼤的属性 属性说明t…

触想全新Z系列工控机扩展IIoT应用潜能

8月31日&#xff0c;触想重磅推出全新Z系列高性能、扩展型工控机——TPC05/06/07-WIPC&#xff0c;提供标准版/双卡槽/四卡槽3款机型选择。 作为边缘计算、机器视觉、AI智能和工业应用的理想机型&#xff0c;Z系列工控机支持Intel第12/13/14代Core™ i3/i5/i7/i9处理器&#xf…

git如何灵活切换本地账号对应远程github的两个账号

git如何灵活切换本地账号对应远程github的两个账号 问题&#xff1a; 有时候我们会同时维护两个github的账号里面的仓库内容&#xff0c;这时候本地git需要频繁的切换ssh&#xff0c;以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账…

kubernetes--配置与存储(ConfigMap、加密数据配置Secret、SubPath、热更新、Volumes、NFS挂载、PV与PVC)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 出自B站博主教程笔记&#xff1a; 完整版Kubernetes&#xff08;K8S&#xff09;全套入门微服务实战项目&#xff0c;带你一站式深入掌握K8S核心能…

Tranformer分布式特辑

随着大模型的发展&#xff0c;如何进行分布式训练也成了每位开发者必备的技能。 单机训练 CPU OffloadingGradient Checkpointing 正向传播时&#xff0c;不存储当前节点的中间结果&#xff0c;在反向传播时重新计算&#xff0c;从而起到降低显存占用的作用 Low Precision Da…

HarmonyOS 是如何实现一次开发多端部署 -- HarmonyOS自学1

一次开发多端部署遇到的几个关键问题 为了实现“一多”的目标&#xff0c;需要解决如下三个基础问题&#xff1a; 问题1&#xff1a;页面如何适配 不同设备间的屏幕尺寸、色彩风格等存在差异&#xff0c;页面如何适配。 问题2&#xff1a;功能如何兼容 不同设备的系统能力…

身份证实名认证接口如何用C#实现

一、什么是身份证实名认证&#xff1f; 身份证实名认证又叫身份证实名核验、身份证二要素、身份实名核验、身份证验证&#xff0c;输入姓名、身份证号&#xff0c;校验此两项是否匹配&#xff0c;同时返回生日、性别、籍贯等信息&#xff0c;同时支持港澳台证件核验。 二、身…

【Three.js】实现护罩(防御罩、金钟罩、护盾)效果

前言&#xff1a; 在这篇博客中&#xff0c;我们将使用 Three.js 从零开始生成一个护罩效果。护罩将使用自定义的 Shader 材质&#xff0c;带有动画效果&#xff0c;最终呈现一个视觉上酷炫的护罩。此篇文章的重点将放在如何生成一个3D护罩&#xff0c;其它功能将在之后的博客…

SprinBoot+Vue旅游网站的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

AI和新基建赋能智慧工地超融合管理平台解决方案

1. 项目背景与需求 电力行业的工程管理正朝着智慧化发展&#xff0c;但目前仍处于起步阶段。为满足数字化、网络化、智能化的发展需求&#xff0c;需要构建一个高效综合监控平台&#xff0c;实现对电力项目全过程的精益化管控。 2. 综合管理平台的构建 该平台集成了超融合实…