ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三数之和---2022/01/20

2022-01-20 18:30:13  阅读:93  来源: 互联网

标签:01 nums 三数 List --- list right left


题目来源:
三数之和

题目描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

双指针的思路:
  (相对单方向指针,会存在判断麻烦以及重复计算的困扰,应在更小的范围内去得到结果)
前提---先做排序处理;
结构---由i遍历所有字符。left和right在i的右边;
判断---如果三数之和大于0 ,right=right-1;
	   如果三数之和小于0 ,left=left-1;
依次得到所有的结果。

收获:
1---关于返回值List<List<Integer>>应如何定义,如何返回?
参考如何创建:HashSet<List<Integer>> set = new HashSet<>();
参考如何返回: return new ArrayList<>(set);

2---对整数数组进行排序
参考:Arrays.sort(nums);
是否可以理解为对于整数就是进行从小到大排序,对字符串就是进行字典序排序。

3---switch,case的用法
4---新建List
参考:List<Integer> list=new ArrayList<>();
5---智能缩进快捷键:ctrl+shift+f

以下为java代码实现:


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

/*
 * 
     作者:城主
     日期 :2022.01.20 
	 题目:
	 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,
	 使得 a + b + c = 0 ?
	 请你找出所有和为 0 且不重复的三元组。
 */

public class Num_three0120 {
	public static void main(String[] args) {
			int [] nums= {};
			System.out.print(threeSum(nums));
		
	}
	
    public static List<List<Integer>> threeSum(int[] nums) {
    	
    	   //判断是否为空,或者数组长度是否小于3
    	   if(nums.length<3)
    	   {
    		   return new ArrayList<>();
    	   }
    	
    	   Arrays.sort(nums);
    	   HashSet<List<Integer>> set = new HashSet<>();
    	   int left,right,retag=0;
    	   for(int i=0;i<=nums.length-3;i++)
    	   {
    		   left=i+1;
    		   right=nums.length-1;
    		   while(left<right)
    		   {
    			   retag=nums[i]+nums[left]+nums[right];
    			   if(retag==0)
    			   {
    				   List<Integer> list=new ArrayList<>();
			   			list.add(nums[i]);
			   			list.add(nums[left]);
			   			list.add(nums[right]);
			   			set.add(list);
			   			left++;
    			   }
    			   if(retag>0)
    			   {
    				   right--;
    			   }
    			   if(retag<0)
    			   {
    				   left++;
    			   } 

    		   }
    	   }
    	   
    	   
    	   return new ArrayList<>(set);

    }

}

总的来说,双指针的方法相对于暴力的方法可能会好一些,提交了之后发现时间和空间都有巨大的优化空间(如果if分支之后,直接continue跳出本次循环,减少判断次数,可能会好一些)。天外有天,人外有人。keep learning!
最后补充python的实现。
同样的思路在python中却超出时间限制。还是贴以下python代码。

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
            """
        if len(nums) < 3 :
            return []
        nums.sort()
        res = []
        for i in range(len(nums) - 3):
            left = i + 1
            right = len(nums) - 1
            while left < right:
                sum = nums[i] + nums[left] + nums[right]
                if sum == 0:
                    res.append([nums[i], nums[left], nums[right]])
                    continue
                if sum > 0:
                    right = right - 1
                    continue
                if sum < 0:
                    left = left + 1
                    continue
        return res

标签:01,nums,三数,List,---,list,right,left
来源: https://blog.csdn.net/qq_44118744/article/details/122605930

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有