--题目导航见页面左上角的悬浮框#目录导航#--

相似题型导航

1.1 twosum两数之和  ||  2.2 3Sum三数之和  ||  2.3 3Sum Closest最接近的三数之和

-------------------------------------------------------------------------------------------------------------------------------------

2.1 Add Two Numbers俩数相加 ||

一、简单

1.1 twosum两数之和

原题:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

实例:

给定 nums = [, , , ], target =
因为 nums[] + nums[] = + =
所以返回 [, ]

暴力解法(java):

复杂度分析:

  • 时间复杂度:O(n²), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间。因此时间复杂度为 O(n²)。

  • 空间复杂度:O(1)。

class Solution {
public int[] twoSum(int[] nums, int target) {
int[] index=new int[];
for(int i=;i<nums.length;i++){
for(int j=i+;j<nums.length;j++){
if(target==nums[i]+nums[j]){
index[]=i;
index[]=j;
return index;
}
}
}
return index;
}
}

一遍hashmap法(java):

复杂度分析:

  • 时间复杂度:O(n), 我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。

  • 空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。

class Solution {
public int[] twoSum(int[] nums, int target) {
int index[]=new int[2];
HashMap <Integer,Integer> map=new HashMap<>(); //动态申请key,value均为Integer的名为map的HashMap函数类型
for (int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){ //判断map中是否存在key=target-num[i]
index[0]=map.get(target-nums[i]); //若存在则将key对应的value值赋给index
index[1]=i;
return index;
}else{
map.put(nums[i],i); //若不存在,则需要将i对应的数组值赋给map作为key,将i赋给map作为value,之所以反转的原因是前面是map.get(key)
}
}
return index;
}
}

二、中等

2.1 Add Two Numbers两数相加

原题:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

实例:

输入:( ->  -> ) + ( ->  -> )
输出: -> ->
原因: + =

解决:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int num=;
ListNode proNode=new ListNode(); //定义链表头
ListNode currentNode=new ListNode(); //定义链表节点接受俩数之和
proNode.next=currentNode; //连接俩个链表节点
do{
int sum=(l1!=null?l1.val:)+(l2!=null?l2.val:)+num; //当俩个链表都不为null时节点与进位相加
num=sum/; //取进位
int result=sum%; //取余数
currentNode.val=result; //将结果填入新链表的节点中
l1=l1!=null?l1.next:l1; //移动参与计算的链表头
l2=l2!=null?l2.next:l2; //移动参与计算的链表头
if(l1!=null||l2!=null||num!=){ //判断俩链表是否为null,之所以使用l1!=null||l2!null而不是&&的原因是:
// 当测试集为[1,8] [0]时,使用&&判断俩链表均不为空会导致长短不同的链表报错,导致结果为[1]
currentNode.next=new ListNode();
currentNode=currentNode.next; //连接俩节点
}
}while(l1!=null||l2!=null||num!=);
return proNode.next; 返回链表
} }

proNode.next=currentNode 单向节点链接

2.2 3Sum三数之和

原题:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

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

实例:

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解决:

在2Sum的问题上解决3Sum的问题,选定i=0,i++来依次作为target,k=i+1,k++和j=nums.length-1 ,j-- 在[Ak~Aj]之间判断是否有nums[k]+nums[j]=-nums[i]的集合

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List; class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new LinkedList<>();
if(nums!=null&&nums.length>){
Arrays.sort(nums);
for(int i=;i<nums.length-; ){
int j=i+;
int k= nums.length-;
while(j<k){
if (nums[j]+nums[k]==-nums[i]) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
result.add(list); k--;
j++; //下面while中继续进行-- ++的目的是为了去重
while (k > j && nums[k] == nums[k + ]) {
k--;
}
while (k > j && nums[j] == nums[j - ]) {
j++;
}
} else if (nums[j]+nums[k]<-nums[i]){
j++;
while (k>j&&nums[j]==nums[j-]){
j++;
}
}
else{
k--;
while (k>j&&nums[k]==nums[k+]){
k--;
}
}
}
i++;
while(i<nums.length-&&nums[i]==nums[i-]){
i++;
}
}
}
return result;
}

2.3 3Sum Closest最接近的三数之和

原题:

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

实例:

例如,给定数组 nums = [-,,,-], 和 target = .

与 target 最接近的三个数的和为 . (- +  +  = ).

解决:

与三数之和的解题思路差不多

class Solution {
public int threeSumClosest(int[] nums ,int target){
Arrays.sort(nums);
long minDiff=Long.MAX_VALUE;
int result=;
int diff=;
int sum=;
for (int i=;i<nums.length-;i++){
int j=i+;
int k=nums.length-;
while (j<k){
sum=nums[i]+nums[j]+nums[k];
diff=Math.abs(sum-target);
if (diff==){
return sum;
}if (diff<minDiff){
minDiff=diff;
result=sum;
}if (sum>target){
k--;
}else {
j++;
} } }
return result;
} }

Math.abs(sum-target)表示取sum-target的绝对值。

【持续更新中,欢迎交流讨论】

<LC刷题一>相加为0的数之leetcode1&2&15&16的更多相关文章

  1. <LC刷题二>回文字符串判断之leetcode125&234

    其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...

  2. 【刷题】【LeetCode】007-整数反转-easy

    [刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接-空 007-整数反转 方法: 弹出和推入数字 & 溢出前进行检查 思路: 我们可以一次构建反转整数的一位 ...

  3. 【刷题】BZOJ 3930 [CQOI2015]选数

    Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...

  4. C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3620 访问. 给定一个包括 n 个整数的 ...

  5. P1707 刷题比赛

    P1707 刷题比赛 10通过 38提交 题目提供者nodgd 标签倍增递推矩阵洛谷原创 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不科学 题目背景 nodgd是一个喜欢写程序的同学, ...

  6. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

  7. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  8. LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式

    作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...

  9. 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

    题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...

随机推荐

  1. java包名命名规范

    Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...

  2. 关于解决乱码问题的一点探索之二(涉及Unicode(utf-16)和GBK)

        在上篇日志中(链接),我们讨论了utf-8编码和GBK编码之间转化的乱码问题,这一篇我们讨论Unicode(utf-16编码方式)与GBK编码之间转换的乱码问题.     在Windows系统 ...

  3. 在服务器中使用 Entity Framework 的 Migration 更新数据库

    在开发环境中,每次我们对要对数据库进行更改,比如增加修改表字段等.改好Entity类后,我们只需在Nuget程序包管理控制台运行 update-database 脚本却可: update-databa ...

  4. (五)Jmeter中的属性和变量

    一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...

  5. Maven学习——1、安装与修改Maven的本地仓库路径

    1.1.下载 官网 http://maven.apache.org/download.cgi 1.2.安装配置 apache-maven-3.3.3-bin.zip 解压下载的压缩包 1.3.配置环境 ...

  6. 第113天:Ajax跨域请求解决方法

    一.原生JS实现ajax 第一步获得XMLHttpRequest对象 第二步:设置状态监听函数 第三步:open一个连接,true是异步请求 第四部:send一个请求,可以发送一个对象和字符串,不需要 ...

  7. codeforces 1027 E. Inverse coloring (DP)

    E. Inverse Coloring time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. java map添加另一个map时候 键值对的类型要一致

    java map添加另一个map时候 键值对的类型要一致

  9. BZOJ 2190 仪仗队(线性筛欧拉函数)

    简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...

  10. 【bzoj4355】Play with sequence 线段树区间最值操作

    题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...