leetcode18 四数之和

leetcode18 4Sum

Posted by BY on January 9, 2019

前言

随机一题

正文

问题来源

本问题来自leetcode上的18题。

问题描述

给定一个未经排序的整数数组,找到最长且连续的的递增序列。

示例 1
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。
示例 2
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

分析:

func fourSum(nums []int, target int) [][]int {
    ret := make([][]int, 0)
    sort.Ints(nums)
    l := len(nums)
    var i,m, j, k int
    var temp int
    for i = 0; i < l - 3; i++ {
        if i > 0 && nums[i] == nums[i-1] {
            continue
        }
        for m = i+1; m < l - 2; m++ {
            if m>i+1&&nums[m] == nums[m-1] {
                continue
            }
            j, k = m + 1, l -1
            for j < k {
                temp = nums[i] + nums[m] + nums[j] + nums[k] - target
                
                if temp > 0 {
                    k--
                } else if temp < 0 {
                    j++
                } else {
                    tempRet := append([]int{},nums[i],nums[m],nums[j],nums[k])
                    ret = append(ret, tempRet)
                    for (k > j) && (nums[k] == nums[k-1]) { //去重
                        k--
                    }
                    for (k > j) && (nums[j] == nums[j+1]) { //去重
                        j++
                    }
                    k--
                    j++
                }
            }
        }
    }
    return ret
}

总结:

结语

不要懒,多看多写。