<LC刷题一>相加为0的数之leetcode1&2&15&16
--题目导航见页面左上角的悬浮框#目录导航#--
相似题型导航
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的更多相关文章
- <LC刷题二>回文字符串判断之leetcode125&234
其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...
- 【刷题】【LeetCode】007-整数反转-easy
[刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接-空 007-整数反转 方法: 弹出和推入数字 & 溢出前进行检查 思路: 我们可以一次构建反转整数的一位 ...
- 【刷题】BZOJ 3930 [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)
目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3620 访问. 给定一个包括 n 个整数的 ...
- P1707 刷题比赛
P1707 刷题比赛 10通过 38提交 题目提供者nodgd 标签倍增递推矩阵洛谷原创 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不科学 题目背景 nodgd是一个喜欢写程序的同学, ...
- [洛谷P1707] 刷题比赛
洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...
- 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等
题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...
随机推荐
- Nodejs学习笔记(二)--- 操作MongoDB数据库
最近看了一些关于mongodb的文章,然后就想知道nodeJS是怎么连接的所以我就尝试去了解了一波(这个菜鸟驿站这个网站还不错,虽然知识文档不是最新的,但是还是蛮好的: 顺便官网地址是这个哦:http ...
- spring复杂数据类型传递
1.VO对象与PO对象的区别: PO(persistant object) 持久对象:通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO ...
- 关于初装kali linux 2.0时DEB文件安装失败的问题
kali linux 是一个基于debian 的linux发行版本,支持deb文件格式的图形化安装. 刚装上kali linux时安装程序总是失败,提示处理时错误. 经过一番爬贴,是软件源的原因,解决 ...
- 判断一个变量是不是json,以及如何将变量转换成json
https://blog.csdn.net/A123638/article/details/52486975这里看到一个很好的方法 // 判断变量是不是jsonisJson(variable: any ...
- vue ui components
vue ui components h_ui https://www.npmjs.com/~hs_ui https://www.npmjs.com/package/h_ui_beta https:// ...
- AngularJS中$watch
$watch在digest执行时,如果watch观察的value与上一次执行时不一样时,就会被触发.angularjs内部的watch实现了页面随model的及时更新.$watch 方法在用的时候主要 ...
- BZOJ4890 Tjoi2017城市
显然删掉的边肯定是直径上的边.考虑枚举删哪一条.然后考虑怎么连.显然新边应该满足其两端点在各自树中作为根能使树深度最小.只要线性求出这个东西就可以了,这与求树的重心的过程类似. #include< ...
- Immediate Decodability HDU - 1305(模板trie)
求这些01串是否有一个是另一个的前缀.. 就是求次数就好了嘛...emm... 网上竟然都用指针写.... #include<cstdio> #include<iostream> ...
- 学Python Django学得很迷茫,怎么办?-转自知乎
本人学生,零编程基础,在学习python的过程中越学越迷茫,感觉像无头苍蝇一样,来知乎取经,下面进入正题吧: 我是先看了中谷的python教学视频,然后跟着慕课网上的python教程把题 ...
- 【转】NHibernate主键类型介绍
转自:http://blog.163.com/wzx_dd/blog/static/1942850722012828934553/ 最近整合了一下框架,用SSH搭建了一个框架,但是在整合好之后,启动t ...