IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode015(三数之和) -> 正文阅读

[数据结构与算法]Leetcode015(三数之和)

地址:

https://leetcode-cn.com/problems/3sum/

解法一(暴力求解)————超出时间限制:

	 List<List<Integer>> threeSum=new ArrayList<>();//存放结果
		 if(nums.length<3) return null;//假如数组长度不足3,肯定没有三个数相加为0
		 for(int i=0;i<nums.length-2;i++) {
			 for(int j=i+1;j<nums.length-1;j++) {
				 for(int k=j+1;k<nums.length;k++) {
					 if(nums[i]+nums[j]+nums[k]==0) {
						 List <Integer> temp=new ArrayList<>();
						 //将这三个数加到temp中
						 temp.add(nums[i]);
						 temp.add(nums[j]);
						 temp.add(nums[k]);
						 Collections.sort(temp);//将temp进行升序排序
						//判断是否出现重复
						 if(!threeSum.contains(temp)) {
							 threeSum.add(temp);
						 }
					 }
				 }
			 }
		 }//for
		return threeSum;

解法二(排序+双指针):

题解:

https://leetcode-cn.com/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/

实现思路:

首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L] 和 nums[R],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集
如果 nums[i]大于 0,则三数之和必然无法等于 0,结束循环
如果 nums[i] == nums[i?1],则说明该数字重复,会导致结果重复,所以应该跳过

当?sum==0时,L++,R--;
假如当 sum == 0 时,nums[L] == nums[L+1] 则会导致结果重复,应该跳过,L++
假如当 sum == 0 时,nums[R]== nums[R?1] 则会导致结果重复,应该跳过,R??
时间复杂度:O(n^2),n 为数组长度

代码:

 public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
     int len = nums.length;
     if(nums == null || len < 3) return ans;
     Arrays.sort(nums); // 排序
     for (int i = 0; i < len ; i++) {
         if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
         if(i > 0 && nums[i] == nums[i-1]) continue; // 跳出此层循环不执行,i++
         int L = i+1;
         int R = len-1;
         while(L < R){
             int sum = nums[i] + nums[L] + nums[R];
             if(sum == 0){
                 ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
                 //假如这里不加L<R,那么遇到nums={0,0,0}这种情况时,L会一直加到末尾
                 while ( L<R&&nums[L] == nums[L+1]) L++; // 去重
                 while ( L<R&&nums[R] == nums[R-1]) R--; // 去重
                 L++;
                 R--;
             }
             else if (sum < 0) L++;
             else if (sum > 0) R--;
         }
     }
     return ans;
	}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 23:30:39  更:2021-07-29 23:31:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:54:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码