zoukankan      html  css  js  c++  java
  • 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基础-集合笔记
    Spring工具类
    XStream的基本使用
    java之路径问题
    Vue 动态组件渲染问题分析
    watch案例解析(element-ui el-select 无法选中问题剖析)
    v-if案例解析(element-ui form-item 结合 v-if 动态生成rule规则表单元素,表单无法验证问题剖析 )
    Vue 虚拟Dom 及 部分生命周期初探
    Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果
    AngularJs(SPA)单页面SEO以及百度统计应用(下)
  • 原文地址:https://www.cnblogs.com/Mrjie/p/6008216.html
Copyright © 2011-2022 走看看