首页 > 其他分享 >leetcode面试经典150题- 15. 三数之和

leetcode面试经典150题- 15. 三数之和

时间:2024-08-20 22:27:23浏览次数:10  
标签:150 right 15 nums int 三数 && ans left

https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-interview-150

 

package leetcode150

import (
    "sort"
    "testing"
)

func TestThreeSum(t *testing.T) {
    nums := []int{0, 2, 2, 3, 0, 1, 2, 3, -1, -4, 2}
    res := threeSum(nums)
    for _, re := range res {
        for _, i := range re {
            print(i)
            print(",")
        }
        println()
    }
}

func threeSum(nums []int) [][]int {
    if len(nums) < 3 {
        return [][]int{}
    }
    ans := make([][]int, 0)
    sort.Ints(nums)
    uStart := -1
    for i, num := range nums {
        if num >= 0 {
            uStart = i
            if num == 0 && i+2 < len(nums) && nums[i+2] == 0 {
                ans = append(ans, []int{0, 0, 0})
            }
            break
        }
    }
    // 表示只有负数或正数
    if uStart <= 0 {
        return ans
    }

    for i := 0; i < uStart; i++ {
        // 已经判断过了
        if i-1 >= 0 && nums[i] == nums[i-1] {
            continue
        }
        for left, right := uStart, len(nums)-1; left < right; {
            res := nums[i] + nums[left] + nums[right]
            if res == 0 {
                ans = append(ans, []int{nums[i], nums[left], nums[right]})
                left++
                right--
            } else if res > 0 {
                right--
            } else if res < 0 {
                left++
            }

            if left-1 >= uStart && nums[left] == nums[left-1] && left < right {
                if nums[i]+nums[left]+nums[left-1] == 0 && nums[left] != nums[right] {
                    ans = append(ans, []int{nums[i], nums[left], nums[left-1]})
                }
                for left < right && nums[left] == nums[left-1] {
                    left++
                }
            }

            if right+1 < len(nums) && nums[i] == nums[right+1] && left < right {
                if nums[i]+nums[right]+nums[right+1] == 0 && nums[left] != nums[right] {
                    ans = append(ans, []int{nums[i], nums[right], nums[right+1]})
                }
                for left < right && nums[right] == nums[right+1] {
                    right--
                }
            }
        }
    }

    for i := len(nums) - 1; i >= uStart; i-- {
        if i+1 < len(nums) && nums[i] == nums[i+1] {
            continue
        }
        for left, right := 0, uStart-1; left < right; {
            res := nums[i] + nums[left] + nums[right]
            if res == 0 {
                ans = append(ans, []int{nums[left], nums[right], nums[i]})
                left++
                right--
            } else if res > 0 {
                right--
            } else if res < 0 {
                left++
            }

            if left-1 >= 0 && nums[left] == nums[left-1] && left < right {
                if nums[i]+nums[left]+nums[left-1] == 0 && nums[left] != nums[right] {
                    ans = append(ans, []int{nums[i], nums[left], nums[left-1]})
                }
                for left < right && nums[left] == nums[left-1] {
                    left++
                }
            }

            if right+1 < uStart && nums[right] == nums[right+1] && left < right {
                if nums[i]+nums[right]+nums[right+1] == 0 && nums[left] != nums[right] {
                    ans = append(ans, []int{nums[i], nums[right], nums[right+1]})
                }
                for left < right && nums[right] == nums[right+1] {
                    right--
                }
            }
        }
    }
    return ans
}

 

标签:150,right,15,nums,int,三数,&&,ans,left
From: https://www.cnblogs.com/MoonBeautiful/p/18370454

相关文章

  • CVE-2021-21315漏洞复现
    一、基本信息攻击机:kaliIP:192.168.100.60靶机:CentOS7IP:192.168.100.40二、攻击过程下载node.js环境wgethttps://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-x64.tar.xztar-xvfnode-v12.18.4-linux-x64.tar.xzmvnode-v12.18.4-linux-x64nodejsmvnodejs......
  • L1-085 试试手气 分数 15
    //10'30"#include<bits/stdc++.h>usingnamespacestd;boolarr[10][10];intmain(){for(inti=1;i<=6;++i){inttmp;cin>>tmp;arr[i][tmp]=true;}intn;cin>>n;......
  • LeetCode-Python-3154. 到达第 K 级台阶的方案数(DFS + 数学)
    给你有一个 非负 整数 k 。有一个无限长度的台阶,最低 一层编号为0。Alice 有一个整数 jump ,一开始值为0。Alice从台阶1开始,可以使用 任意 次操作,目标是到达第 k 级台阶。假设Alice位于台阶 i ,一次 操作 中,Alice可以:向下走一级到 i-1 ,但该操作......
  • P1543 [POI2004] SZP 题解
    P1543[POI2004]SZP题解传送门。题目简述有\(n\)个人,每个人都会监视另一个人,要求选出尽可能多的同学,使得选出的每一名同学都必定会被监视到。且选出的同学不可再监视其他人。思路简述因为任意一个人只能被另一个人管,那么就想到,如果没人管的同学就不能被选(不被监视)。若某......
  • 015、吃新节
    015、吃新节作者:千龙忆苦思甜喜气融,家家户户笑声中。稻花鱼跃香飘逸,碧果堆盘色最浓。老少围桌谈兴事,儿童戏舞乐无穷。人民欢聚国昌盛,吃新佳节笑意同。 这首诗以“吃新节”为题,描绘了一幅节日庆典的温馨画面。以下是对诗句的逐句解析:1、忆苦思甜喜气融-表达了人们在节日......
  • 打靶记录15——Ripper
    靶机:https://www.vulnhub.com/entry/ripper-1,706/KaliIP地址:192.168.0.102靶机IP地址:192.168.0.103VirtualBox设置为桥接模式难度:低->中目标:取得root权限+2Flag涉及攻击方法:主机发现端口扫描Web信息收集内部系统泄露代码审计备份文件泄密Webmin漏洞利......
  • leetcode面试经典150题-125. 验证回文串
    https://leetcode.cn/problems/valid-palindrome/description/?envType=study-plan-v2&envId=top-interview-150 packageleetcode150import("strings""testing")funcTestIsPalindrome(t*testing.T){s:="0P"......
  • 章节七:215 +个 ChatGPT优秀提示以及如何编写自己的提示
    关注的人一天可以看到10篇文章!章节一:章节一:215+个ChatGPT优秀提示以及如何编写自己的提示-CSDN博客章节二:章节二:215+个ChatGPT优秀提示以及如何编写自己的提示-CSDN博客章节三:章节三:215+个ChatGPT优秀提示以及如何编写自己的提示-CSDN博客章节四:章节四:215+个Chat......
  • L1-078 吉老师的回归 分数 15
    如果是测试点2卡住的话,可以试试以下样例。输入样例:52easyL1easyL2easyL3ezL4ezL5输出样例:WoAKle代码://long#include<bits/stdc++.h>usingnamespacestd;boolfunc(strings){if(s.find("qiandao")!=string::npos)returnfalse;if(s.......
  • P10155题解
    1题意给定一个排列ppp,每次可以选择一个数pi......