算法Day-8

news2024/10/24 17:28:34

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

本题求一个数组中三个不同下标的值相加等于0的三个值,并返回这三个数,不容许重复的三元组,但返回的值的顺序可以随意。

我们这题先将nums进行排序,以便后续进行去重操作,可以通过一个for循环加双指针的思想进行求解,通过for循环i值,获取三元组中第一个数,并判断nums[i]是否大于0,因为是排序之后的数组,如果num[i]还大于0,就说明后续也没有几个数相加等于0的可能,直接返回。然后就是去重i,当i>0,去比较i和他前一个i是否相等。如果相等就说明重复,跳出当前循环将i++。确定了第一个数的值,我们就开始取left = i+1和right  =数组最后一位的下标,只有当left<right时才进行循环,判断三个数的值=sum,如果sum>0就让right--,如果sum<0就让left++,因为排过序了,所以right在数组最后--之后值一定变小,同理left的值一定变大,当sum ==0时就将各个值添加到res中,并因为要对left和right去重,判断各自要移动的方向的值是否与现在的值相等,因为我们现在的值已经加入到res中,所以有相等的就要直接++变成相等的值,在最后将left++和right--;最后再返回res。

public class Solution {
    public IList<IList<int>> ThreeSum(int[] nums) {
        var res = new List<IList<int>>();
        Array.Sort(nums);
        for(int i = 0;i<nums.Length;i++){
            if(nums[i]>0){
                break;
            }
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int left = i+1;
            int right = nums.Length-1;
            while(left<right){
                int sum = nums[i]+nums[left]+nums[right];
                if(sum>0){
                    
                    right--;
                     
                }else if(sum<0){
                    
                    left++;
                    
                    
                }else{
                    res.Add(new List<int>{nums[i],nums[left],nums[right]} );
                   while(left<right&&nums[right]==nums[right-1]) right--;
                    while(left<right&&nums[left]==nums[left+1]) left++;
                    left++;
                    right--;
                }
            }
        }
        return res;
    }
}

18. 四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:

  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

本题和三数之和基本思想一致,但多了一个值并且,target不一定是0,可能小于零,在剪枝时不但要判断nums[k]否大于零,还要判断值是否大于target,这样判断就默认target是大于0的,因为如果target小于0,比如target为-5,而数组为[-2,-2,-1]这样如果只判断num[k]大于target就跳出循环,会导致结果有问题。然后再遍历i=k+1;再继续剪枝,但条件要变成nums[k]+nums[i]>0&&nums[k]+nums[i]>target,现在将k和i看作一个整体。然后在想三数之和一样去获取left和right的值,并去重。

public class Solution {
    public IList<IList<int>> FourSum(int[] nums, int target) {
        var res = new List<IList<int>>();
        Array.Sort(nums);
        for(int k = 0;k<nums.Length;k++){
            if(nums[k]>0&&nums[k]>target){
                break;
            }
            if(k>0&&nums[k]==nums[k-1]){
                continue;   
            }
            for(int i = k+1;i<nums.Length;i++){
                    if(nums[k]+nums[i]>0&&nums[k]+nums[i]>target){
                        break;
                    }
                    if(i>k+1&&nums[i]==nums[i-1]){
                        continue;
                    }
                    int left = i+1;
                    int right = nums.Length-1;
                    while(left<right){
                        int n1 = nums[left];
                        int n2 = nums[right];
                        int sum = nums[k]+nums[i]+n1+n2;
                        if(sum>target){
                            right--;
                        }else if(sum<target){
                            left++;
                        }else{
                            res.Add(new List<int>{nums[i],nums[k],n1,n2});
                            while(left<right&&nums[right-1]==n2) right--;
                            while(left<right&&nums[left+1]==n1) left++;
                            right--;
                            left++;
                        }
                    }
                }
        }
        return res;
    }
}

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

本题反转字符数组将hello->olleh的过程。

可以使用双指针的思想

声明两个int类型的left一个等于0,一个right等于数组最后下标,即数组的开头和结尾,进行循环交互首尾数值,直到left<right交换完毕。

public class Solution {
    public void ReverseString(char[] s) {
        int right = s.Length-1;
        int left = 0;
        while(left<right){
            char temp = s[right];
            s[right] = s[left];
            s[left] = temp;
            left++;
            right--;
        }
    }
}

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

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

相关文章

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中&#xff0c;继承和重载是面向对象编程&#xff08;OOP&#xff09;中的重要概念。通过合理运用继承与重载&#xff0c;不仅能提高代码的复用性和灵活性&#xff0c;还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载&#xff0c;并…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

Java 多线程(五)—— 阻塞队列、wait、notify

wait wait 和 notify 都是 Object 类提供的方法&#xff0c;也就是说 Java 任意对象都可以使用 这两个方法。 首先 wait 会抛出 InterruptedException 这个异常&#xff0c;说明这个方法可以被 interrupt 给唤醒。 然后我们是不能直接使用 wait 方法的&#xff0c;否则还会抛…

Win10系统安装docker操作步骤

Docker下载 docker下载地址&#xff1a;Docker: Accelerated Container Application Development 打开网页后&#xff0c;点击图下所示&#xff0c;下载windows版本的docker 启用Hyper-V 和容器特性 右键左下角windows图标&#xff0c;选择应用和功能 然后在下面的界面中&am…

电脑技巧:Rufus——最佳USB启动盘制作工具指南

目录 一、功能强大&#xff0c;兼容性广泛 二、界面友好&#xff0c;操作简便 三、快速高效&#xff0c;高度可定制 四、安全可靠&#xff0c;社区活跃 在日常的电脑使用中&#xff0c;无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务&#xff0c;拥…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW&#xff1a; RUNNABLE&#xff1a; TIMED_WAITING&#xff1a; TERMINATED…

ElasticSearch-7.17.10集群升级至ElasticSearch-7.17.24

文章目录 集群概览 主机名系统版本es01CentOS_7.6-aaarch64ElasticSearch-7.17.10es02CentOS_7.6-aaarch64ElasticSearch-7.17.10es03CentOS_7.6-aaarch64ElasticSearch-7.17.10 需求 1. 将三台ES节点从ElasticSearch-7.17.10升级至ElasticSearch-7.17.24&#xff1b; 2. 保证…

1212,查询球队积分

查询球队积分 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表…

HarmonyOS 模块化设计

1.HarmonyOS 模块化设计 模块化设计文档   应用程序包开发与使用文档 1.1. 概述 组件化一直是移动端比较流行的开发方式&#xff0c;有着编译运行快&#xff0c;业务逻辑分明&#xff0c;任务划分清晰等优点&#xff0c;HarmonyOs组件化的使用&#xff0c;有利于模块之间的解…

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集 数据概述数据下载 数据处理合并多个SRTM 数据-GDAL库转为geogrid二进制格式WPS 中的设置 数据对比海洋区域缺省值参考 WRF中地形数据&#xff08;海拔高度&#xff09;分辨率最高为30s&#xff0c;差不多就是900 m&#xff0c;…

CST光子晶体微谐振腔分析和Q值提取

本期介绍基于文献[1]的一种二维光子晶体波导结构&#xff0c;利用路径上加微谐振腔来实现一些特殊的滤波功能。一般是要看谐振频率的变化和Q值变化&#xff0c;因为工艺误差或任何造成结构不规则的因素对这样细小的结构谐振来说影响非常大。下图为文献中提到的硅薄膜结构&#…

使用Jenkins持续集成的一些经验总结!

01、Performance插件兼容性问题 自由风格项目中&#xff0c;有使用 Performance 插件收集构建产物&#xff0c;但是截至到目前最新版本&#xff08;Jenkins v2.298&#xff0c;Performance&#xff1a;v3.19&#xff09;&#xff0c;此插件和Jenkins都存在有兼容性问题&#x…

业余时间试一试利用AI 人工智能赚钱

内容创作与写作&#xff1a; 撰写文章&#xff1a;许多网站、博客和企业都需要大量的优质内容。利用 AI 工具如 ChatGPT 等&#xff0c;获取文章的思路、框架甚至初稿&#xff0c;然后根据自己的知识和经验进行修改、润色和完善。你可以在一些自由撰稿人平台、内容创作平台上承…

autumn是 “秋天”,year是 “年”,那autumn years是什么意思?柯桥商务剑桥英语学习外贸口语

autumn是“秋天”&#xff0c;year是“年”&#xff0c; 那你知道 autumn years 是什么意思&#xff1f; autumn years是什么意思&#xff1f; autumn years 直译为“秋天的15857575376*年”&#xff0c;但这样的理解并不准确&#xff0c;《剑桥辞典》中对这个词组的英文解释…

如何评估检索增强型生成(RAG)应用

RAG&#xff0c;也就是检索增强型生成&#xff0c;是现在大型语言模型&#xff08;LLMs&#xff09;时代里的一个超火的AI框架&#xff0c;比如你知道的ChatGPT。它通过把外面的知识整合进来&#xff0c;让这些模型变得更聪明&#xff0c;能给出更准确、更及时的回答。详见前篇…

[WiFi] Wi-Fi HaLow: IEEE 802.11ah 无线网络协议介绍

参考链接 802.11ah&#xff08;HaLow&#xff09;协议解析1&#xff1a;协议简介 - 知乎 802.11ah&#xff08;HaLow&#xff09;协议解析3&#xff1a;物理层改进 - 知乎 Wi-Fi HaLow: IEEE 802.11ah Wireless Networking Protocol - IoTEDU Wi-Fi CERTIFIED HaLow | Wi-F…

实现iOS Framework生成全流程详解

引言 在iOS开发中&#xff0c;Framework是实现代码复用和模块化开发的有效手段。它不仅可以将复杂的功能封装为独立的组件&#xff0c;还能提升代码的可维护性和可扩展性。Framework的广泛应用使得我们可以轻松地集成第三方库&#xff0c;或将自己的功能打包分发给团队成员使用…

CF351E Jeff and Permutation 题解

#1024程序员节&#xff5c;征文# 人生中的第一道紫题。。。 ​​​​​​题目传送门 解题思路 首先我们可以得到读入时 的正负不影响答案&#xff0c;因为我们可以进行一次操作将它们变成它们的相反数&#xff0c;从而使其变成原数&#xff0c;因此&#xff0c;我们可以将…

项目篇--Maven+Idea+ PrimeFaces+Jsf--项目搭建

文章目录 前言一、PrimeFaces 和 Jsf&#xff1a;1.1 JSF 基础&#xff1a;1.2 PrimeFaces 扩展&#xff1a; 二、项目搭建&#xff1a;2.1 Maven 项目的创建&#xff1a;2 xml 配置&#xff1a;2.1 pom.xml 配置2.2web.xml 配置&#xff1a; 2.3 代码&#xff1a;2.3.1 页面&a…

(六)STM32F407 cubemx MPU6050通讯硬件寄存器配置部分(2)

这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。废话不多说直接开始主题&#xff0c;本人是基于STM32F407VET6芯片&#xff0c;但是意在你看懂这篇文章后&#xff0c;不管是F1,F4,H7等一系列MPU6050通讯硬件寄…