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

相似题型导航

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. Nodejs学习笔记(二)--- 操作MongoDB数据库

    最近看了一些关于mongodb的文章,然后就想知道nodeJS是怎么连接的所以我就尝试去了解了一波(这个菜鸟驿站这个网站还不错,虽然知识文档不是最新的,但是还是蛮好的: 顺便官网地址是这个哦:http ...

  2. spring复杂数据类型传递

    1.VO对象与PO对象的区别: PO(persistant object) 持久对象:通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO ...

  3. 关于初装kali linux 2.0时DEB文件安装失败的问题

    kali linux 是一个基于debian 的linux发行版本,支持deb文件格式的图形化安装. 刚装上kali linux时安装程序总是失败,提示处理时错误. 经过一番爬贴,是软件源的原因,解决 ...

  4. 判断一个变量是不是json,以及如何将变量转换成json

    https://blog.csdn.net/A123638/article/details/52486975这里看到一个很好的方法 // 判断变量是不是jsonisJson(variable: any ...

  5. vue ui components

    vue ui components h_ui https://www.npmjs.com/~hs_ui https://www.npmjs.com/package/h_ui_beta https:// ...

  6. AngularJS中$watch

    $watch在digest执行时,如果watch观察的value与上一次执行时不一样时,就会被触发.angularjs内部的watch实现了页面随model的及时更新.$watch 方法在用的时候主要 ...

  7. BZOJ4890 Tjoi2017城市

    显然删掉的边肯定是直径上的边.考虑枚举删哪一条.然后考虑怎么连.显然新边应该满足其两端点在各自树中作为根能使树深度最小.只要线性求出这个东西就可以了,这与求树的重心的过程类似. #include< ...

  8. Immediate Decodability HDU - 1305(模板trie)

    求这些01串是否有一个是另一个的前缀.. 就是求次数就好了嘛...emm... 网上竟然都用指针写.... #include<cstdio> #include<iostream> ...

  9. 学Python Django学得很迷茫,怎么办?-转自知乎

    本人学生,零编程基础,在学习python的过程中越学越迷茫,感觉像无头苍蝇一样,来知乎取经,下面进入正题吧:        我是先看了中谷的python教学视频,然后跟着慕课网上的python教程把题 ...

  10. 【转】NHibernate主键类型介绍

    转自:http://blog.163.com/wzx_dd/blog/static/1942850722012828934553/ 最近整合了一下框架,用SSH搭建了一个框架,但是在整合好之后,启动t ...