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

相似题型导航

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. Django内置的分页模块

    自定义分页 未封装版: 优点:直观 缺点:代码乱,不易维护,可拓展性差 data = [] for i in range(1, 302): tmp = {"id": i, &quo ...

  3. NIO网络编程中重复触发读(写)事件

    一.前言 公司最近要基于Netty构建一个TCP通讯框架, 因Netty是基于NIO的,为了更好的学习和使用Netty,特意去翻了之前记录的NIO的资料,以及重新实现了一遍NIO的网络通讯,不试不知道 ...

  4. 实现全站 HTTPS ,为什么国内网站总是那么slow&&low呀!

    1 https://konklone.com/post/switch-to-https-now-for-free# https://theintercept.com/2014/11/20/non-pr ...

  5. 平衡树以及AVL树

    平衡树是计算机科学中的一类数据结构. 平衡树是计算机科学中的一类改进的二叉查找树.一般的二叉查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均摊复杂度会上升 ...

  6. 第154天:canvas基础(一)

    一.canvas简介 ​ <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...

  7. 第117天:Ajax实现省市区三级联动

    Ajax实现省市区三级联动 思路: (1)首先获取省份信息 (2)发起Ajax请求,注意dataType中的T大写 (3)封装回调函数,回调函数success中用$.each循环每一条数据,动态创建o ...

  8. 【.Net】C# 将Access中时间段条件查询的数据添加到ListView中

    一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加 ...

  9. BZOJ 1190 梦幻岛宝珠(分组01背包)

    跑了7000ms... 这是个体积和价值都超大的背包.但是体积保证为a*2^b的(a<=10,b<=30)形式.且n<=100. 于是可以想到按b来分组.这样的话每组最多为a*n*2 ...

  10. 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp

    题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...