go语言的四数相加等于指定数算法

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。

首先将四个数组分割为两两数组,前两个数组值相加,后两个数组相加,入股前两个数组相加和与后两个数组相加和正好为相反数,四个元素之和为0.

首先:

将两数组的元素进行遍历相加,相加之和为map的索引。所指向的元素,就是出现的次数。

func foursumcount(A []int, B []int, C []int, D []int) int{
 des :=map[int]int{}
 for _,v:=range A{
  for _,w:=range B{
   des[v+w]++
  }
 }
}

再次遍历另两个数组,将两个数组的元素进行相加,取和的相反数,通过使用相反数在map中查找,如果没出现,所指向的数是0,如果出现过这个数的相反数,则所指向的数大于一。

func foursumcount(A []int, B []int, C []int, D []int) int{
 des :=map[int]int{}
 ans:=0
 for _,v:=range C{
  for _,w:=range D{
   ans +=des[-v-w]
  }
 }
}

最后将总数返回

全部代码

func fourSumCount(A []int, B []int, C []int, D []int) int {
 des := map[int]int{}
 ans:=0
 for _,v :=range A{//遍历两个数组,将两个数组的和作为一个索引,进行+1操作
  for _,w:=range B{
    des[v+w]++
  }
 }
 for _,v :=range C{//遍历另两个数组,如果这两个数组进行相加的和的相反数在map中不为1,则证明出现过
  for _,w:=range D{
   ans +=des[-v-w]
  }
 }
 return ans//返回总数
}

补充:算法题:三个数相加等于某个特定值

题目来自于leetcode第十五题

给定一个n个整数的数组S,是否存在S中的元素a,b,c,使得a + b + c = 0? 查找数组中所有唯一的三元组,它们的总和为零。

注意:解决方案集不能包含重复的三元组。

例子:

给定数组:

S = [-1, 0, 1, 2, -1, -4]

解决方案:

[[-1, 0, 1],[-1, -1, 2]]

在刚看到这道题目的题目的时候,首先想到的就是暴力解法,将数组排序后直接嵌套三个循环,这样子虽然简单,但是时间复杂度确实n^3,遇到数据量过大的时候消耗太大,提交的时候并没有通过。

自己在想了一段时间后想到了一些优化方案,但是本质上都没有将次方缩减,所以仍然需要改进,目标为n^2。

首先,目标为n^2的话,就需要将数组扫描两遍,第一层循环没有问题,但要将第二层和第三层循环缩减为扫描一遍,因为是要将两个数相加等于某个值,所以可将有序数组分别从前往后和从后往前扫描,直至碰头,碰头后如果继续循环的话,所得到的结果会重复,

所以到碰头后可以跳出循环。这样子只需要扫描数组一遍就可达到两层循环的结果。思路简单是这样,在实现的时候要考虑一些其他的问题,具体实现的代码如下:

public class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new LinkedList<List<Integer>>();
        if(nums.length<3){
            return result;
        }
        Arrays.sort(nums);
        int left=0,right=nums.length-1;
        for(int mid=0;mid< nums.length-2;mid++){
            if(nums[mid]>0) break;
            if(mid == 0 || (mid > 0 && nums[mid] != nums[mid-1])){
                left=mid+1;
                right=nums.length-1;
                while(left<right){
                    if(nums[left]+nums[mid]+nums[right] ==0){
                        result.add(Arrays.asList(nums[mid],nums[left],nums[right]));
                        while (left < right && nums[left] == nums[left+1]) left++;
                        while (left < right && nums[right] == nums[right-1]) right--;
                        left++;
                        right--;
                    }else if(nums[left]+nums[mid]+nums[right]<0){
                        left++;
                    }else if(nums[left]+nums[mid]+nums[right]>0){
                        right--;
                    }
                }
            }
        }
        return result;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • golang简易令牌桶算法实现代码

    基本思路:定义一个chan,chan大小为需要限制的qps大小,go一个协程启动tick,每1000/qps时间在tick中写入数值,启动另一个协程,读取chan中的值,如果读取到chan中有值,则向下层接口发送请求. 代码如下: package main import ( "fmt" "time" "httpclient" ) var LEN int = 10 func tickStoreCh(arrlen int, ch chan int)

  • 使用GO实现Paxos共识算法的方法

    什么是Paxos共识算法 最初的服务往往都是通过单体架构对外提供的,即单Server-单Database模式.随着业务的不断扩展,用户和请求数都在不断上升,如何应对大量的请求就成了每个服务都需要解决的问题,这也就是我们常说的高并发.为了解决单台服务器面对高并发的苍白无力,可以通过增加服务器数量来解决,即多Server-单Database(Master-Slave)模式,此时的压力就来到了数据库一方,数据库的IO效率决定了整个服务的效率,继续增加Server数量将无法提升服务性能.这就衍生出了当前

  • 自己动手用Golang实现约瑟夫环算法的示例

    继上一篇单向链表,单线链表可以进一步扩展为环,如下图所示: 特点: 1.第一个节点称为头部节点,最后一个节点称为尾部节点 2.每个节点都单方面的指向下一个节点 3.尾部节点下一个节点指向头部节点 题目: 17世纪的法国数学家加斯帕讲了这样一个故事: 15个教徒和15 个非教徒,在深海海上遇险,必须将一半的人投入海海中,其余的人才能幸免于难,于是想了一个办法: 30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海海,如此循环进行直到仅余15个人为止.问怎样排法,才能使每次投入大

  • Golang实现拓扑排序(DFS算法版)

    问题描述:有一串数字1到5,按照下面的关于顺序的要求,重新排列并打印出来.要求如下:2在5前出现,3在2前出现,4在1前出现,1在3前出现. 该问题是一个非常典型的拓扑排序的问题,一般解决拓扑排序的方案是采用DFS-深度优先算法,对于DFS算法我的浅薄理解就是递归,因拓扑排序问题本身会有一些前置条件(本文不过多介绍拓扑算法的定义),所以解决该问题就有了以下思路. 先将排序要求声明成map(把map的key,value看作对顺序的要求,key应在value前出现),然后遍历1-5这几个数,将每次遍

  • 用go写的五子棋预测算法的实现

    详细请看 Github:https://github.com/shanhuijie/GoWatch/tree/master/fiveinarow five in a row (五子棋成功预测) 从横.纵. 左斜升. 左斜降 四个角度判断 const( matrix = 50*50 point = 3 ) type Coordinat struct{ x int y int } type Allinat struct{ key []Coordinat } func InArray(need Coo

  • go语言的四数相加等于指定数算法

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 首先将四个数组分割为两两数组,前两个数组值相加,后两个数组相加,入股前两个数组相加和与后两个数组相加和正好为相反数,四个元素之和为0. 首先: 将两数组的元素进行遍历相加,相加之和为map的索引.所指向的元素,就是出现的次数. func foursumcount(A []int, B []int, C []int, D []i

  • VBS 两数相加取值问题分析

    一个昵称为预言家晚报的朋友很喜欢玩SOSO问问,等级LV10,已经算比较高了.晚上挂QQ的时候,看到他的问问有更新,就点进去看了一下,问题是: 我写了如下一段VBS 复制代码 代码如下: dim a,b,c a=inputbox("a","please input") b=inputbox("b","please input") c=a+b msgbox(c) 可是最后结果是11,我知道肯定是倒数第二行的"+&quo

  • C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 直接看例子来说明问题吧 #include <iostream> using namespace std; int main() { int a = -1; unsigned int b = 16; if(a > b) cout<<"负数竟然大于正数了!\n";

  • 易语言超级编辑框中寻找指定文本并选中的示例

    超级编辑框中寻找指定文本并选中 .版本 2 .支持库 iext2 .程序集 窗口程序集1 .子程序 __启动窗口_创建完毕 .子程序 取字符数, 整数型 .参数 文本, 文本型 .局部变量 长度, 整数型 .局部变量 个数, 整数型 .局部变量 字符位置, 整数型 长度 = 取文本长度 (文本) 个数 = 长度 字符位置 = 1 .判断循环首 (字符位置 < 长度) .如果 (取代码 (取文本中间 (文本, 字符位置, 1), ) < 0 或 取代码 (取文本中间 (文本, 字符位置, 1),

  • go语言goto语句跳转到指定的标签实现方法

    goto 语句通过标签进行代码间的无条件跳转.goto 语句可以在快速跳出循环.避免重复退出上有一定的帮助.Go 语言中使用 goto 语句能简化一些代码的实现过程. 使用 goto 集中处理错误 package main import "fmt" func main() { for x := 0; x < 10; x++ { for y := 0; y < 10; y++ { if y == 2 { // 跳转到标签 goto breakHere } } } // 手动返

  • python3两数相加的实现示例

    两数相加 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9,

  • C语言实现四窗口聊天

    C语言实现四窗口聊天,供大家参考,具体内容如下 为了练习前段时间学习的共享内存.管道.消息队列等进程同步机制,做了一个聊天小项目. 项目描述: 有4个进程,A进程和B进程负责通信,从标准输入读到的字符串通过管道发给对方,A1和B1进程负责显示,其中: A进程和B进程通过管道通信,A进程和A1进程通过共享内存通信,B进程和B1进程通过消息队列通信: A进程从标准输入读到的字符串后,放到管道和共享内存里,从管道中读到的字符串放到共享内存里,B进程从管道中拿到A放的字符串,A1进程到共享内存中拿到字符

  • C语言使用四种方法初始化结构体

    什么是结构体 在实际问题中,一组数据往往有很多种不同的数据类型.例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩.又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型的价格.在这些情况下,使用简单的基本数据类型甚至是数组都是很困难的.而结构体(类似Pascal中的"记录"),则可以有效的解决这个问题.结构体本质上还是一种数据类型,但它可以包括若干个"成员&quo

  • C语言巧用二分查找实现猜数游戏

    目录 (壹)二分查找   1.1  何为二分查找   1.2  二分查找的原理   1.3  查找条件   1.4  代码实现 1.4.1  初始化数据 1.4.2  核心函数 (贰)猜数字游戏   2.1  菜单初始化   2.2  核心函数   2.3  main函数   2.4  总代码 文章Gitee仓库:文章源代码 (壹)二分查找   1.1  何为二分查找 折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是

  • C语言每日练习之统计文本单词数及高频词

    作业1:统计出txt文本里面的单词数,并找出频率出现最高的单词是哪个? 运行结果: 上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //文件打开 //string file = System.IO.Fi

随机推荐