• 2016/10/28 很久没更了 leetcode解题 3sum问题进阶版4sum


    18. 4Sum

    Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

    Note

    For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.
    
    A solution set is:
    [
      [-1,  0, 0, 1],
      [-2, -1, 1, 2],
      [-2,  0, 0, 2]
    ]
    

      

    : The solution set must not contain duplicate quadruplets.

    还是找和的问题 不过这次是四个数 并且结果为target其实和0没什么区别 把是否等于0改为是否等于target就行了 还是一样不许重复 感觉没什么太大难度 多加一个for循环嵌套就能解决

    下面就不给解题思路了 在前面的文章有写 这里这接敲代码 

    直接通过了 自己也有点吃惊 可能之前写三数之和有手感了 居然没报error answer  看一下details

    太烂了。。。

    有时候还是不错

    要优化的话可能先把特殊情况先过滤掉吧 可以避免很多没必要的循环

    去看下别人的解法

    public List<List<Integer>> fourSum(int[] nums, int target) {
    		ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
    		int len = nums.length;
    		if (nums == null || len < 4)
    			return res;
    
    		Arrays.sort(nums);
    
    		int max = nums[len - 1];
    		if (4 * nums[0] > target || 4 * max < target)
    			return res;
    
    		int i, z;
    		for (i = 0; i < len; i++) {
    			z = nums[i];
    			if (i > 0 && z == nums[i - 1])// avoid duplicate
    				continue;
    			if (z + 3 * max < target) // z is too small
    				continue;
    			if (4 * z > target) // z is too large
    				break;
    			if (4 * z == target) { // z is the boundary
    				if (i + 3 < len && nums[i + 3] == z)
    					res.add(Arrays.asList(z, z, z, z));
    				break;
    			}
    
    			threeSumForFourSum(nums, target - z, i + 1, len - 1, res, z);
    		}
    
    		return res;
    	}
    
    	/*
    	 * Find all possible distinguished three numbers adding up to the target
    	 * in sorted array nums[] between indices low and high. If there are,
    	 * add all of them into the ArrayList fourSumList, using
    	 * fourSumList.add(Arrays.asList(z1, the three numbers))
    	 */
    	public void threeSumForFourSum(int[] nums, int target, int low, int high, ArrayList<List<Integer>> fourSumList,
    			int z1) {
    		if (low + 1 >= high)
    			return;
    
    		int max = nums[high];
    		if (3 * nums[low] > target || 3 * max < target)
    			return;
    
    		int i, z;
    		for (i = low; i < high - 1; i++) {
    			z = nums[i];
    			if (i > low && z == nums[i - 1]) // avoid duplicate
    				continue;
    			if (z + 2 * max < target) // z is too small
    				continue;
    
    			if (3 * z > target) // z is too large
    				break;
    
    			if (3 * z == target) { // z is the boundary
    				if (i + 1 < high && nums[i + 2] == z)
    					fourSumList.add(Arrays.asList(z1, z, z, z));
    				break;
    			}
    
    			twoSumForFourSum(nums, target - z, i + 1, high, fourSumList, z1, z);
    		}
    
    	}
    
    	/*
    	 * Find all possible distinguished two numbers adding up to the target
    	 * in sorted array nums[] between indices low and high. If there are,
    	 * add all of them into the ArrayList fourSumList, using
    	 * fourSumList.add(Arrays.asList(z1, z2, the two numbers))
    	 */
    	public void twoSumForFourSum(int[] nums, int target, int low, int high, ArrayList<List<Integer>> fourSumList,
    			int z1, int z2) {
    
    		if (low >= high)
    			return;
    
    		if (2 * nums[low] > target || 2 * nums[high] < target)
    			return;
    
    		int i = low, j = high, sum, x;
    		while (i < j) {
    			sum = nums[i] + nums[j];
    			if (sum == target) {
    				fourSumList.add(Arrays.asList(z1, z2, nums[i], nums[j]));
    
    				x = nums[i];
    				while (++i < j && x == nums[i]) // avoid duplicate
    					;
    				x = nums[j];
    				while (i < --j && x == nums[j]) // avoid duplicate
    					;
    			}
    			if (sum < target)
    				i++;
    			if (sum > target)
    				j--;
    		}
    		return;
    	}
    

    跟我想的差不多 确实节省了不少时间 因为花了不少代码在处理无用循环上  加了很多条件判断避免废循环  

  • 相关阅读:
    Java中,&&与&,||与|的区别
    Hibernate中的merge方法 以及对象的几中状态
    你希望函数的某些参数强制使用关键字参数传递:
    7.1 可接受任意数量参数的函数:
    perl urlencode
    python UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 15: invalid continuation
    python 使用__slots__
    python 面向对象编程
    Python flask post接口
    python flask get传参
  • 原文地址:https://www.cnblogs.com/Mrjie/p/6008216.html
Copyright © 2020-2023  润新知