Leetcode:454. 4Sum II (解决时间和空间复杂度是关键)

来源:互联网 发布:php 字节数组转字符串 编辑:程序博客网 时间:2024/06/06 14:29
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero.To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1.Example:Input:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2]Output:2Explanation:The two tuples are:1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 02. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0

这个题主要解决空间和时间的问题,我的一种错误解法就是控制时间复杂度在n*n但是空间复杂度不满足OJ要求。

错误代码:

public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) {        int count = 0;        int index = 0;        int nums1[] =new int[A.length*B.length];        int nums2[] =new int[A.length*B.length*C.length];        int nums3[] =new int[A.length*B.length*C.length*D.length];        for (int i = 0; i < A.length; i++) {            for (int j = 0; j < B.length; j++) {                nums1[index++]=A[i]+B[j];            }        }        index = 0;        for (int i = 0; i < nums1.length; i++) {            for (int j = 0; j < C.length; j++) {                nums2[index++]=nums1[i]+C[j];            }        }        index = 0;        for (int i = 0; i < nums2.length; i++) {            for (int j = 0; j < D.length; j++) {                nums3[index++]=nums2[i]+D[j];            }        }        for (int i = 0; i < nums3.length; i++) {            if (nums3[i]==0) {                count++;            }        }        for (int i = 0; i < nums1.length; i++) {            System.out.println(nums1[i]);        }        for (int i = 0; i < nums2.length; i++) {            System.out.println(nums2[i]);        }        for (int i = 0; i < nums3.length; i++) {            System.out.println(nums3[i]);        }        return count;    }

借助HashMap,其实这个非常的好想到,这样想,我们是要来记录两个数字的和,但是如果用数组,也就是上面的情况,那么肯定有重复的值存在,所以现在我们用Map来存值,可以解决时间复杂度不满足的情况,如果sums不存在这个sum,那么就加入,键为sum 值为1 但是我们知道键值对不允许键重复,当存在和为重复的时候,那么我们就判断一下,然后sums加入sum,但是这个值加1,这样就可以统计当前sum的个数,为后面计算元组个数做准备。
之后再第二个循环里面 如果存在-sum那么这个元组就可以,取出值相加就可以了。
———简单清晰。

public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) {        Map<Integer,Integer> sums = new HashMap<>();        int count = 0;        for(int i=0; i<A.length;i++) {            for(int j=0;j<B.length;j++){                int sum = A[i]+B[j];                if(sums.containsKey(sum)) {                    sums.put(sum, sums.get(sum)+1);                } else {                    System.out.println(sum);                    sums.put(sum, 1);                }            }        }        //System.out.println(sums.toString());        for(int k=0; k<A.length;k++) {            for(int z=0;z<C.length;z++){                int sum = -(C[k]+D[z]);                if(sums.containsKey(sum)) {                    count+=sums.get(sum);                }            }        }        return count;    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6个月婴儿大小眼怎么办 健身教练岁数大了以后怎么办 超变战陀玩具手柄坏了怎么办 飓风战魂三陀螺中轴坏了怎么办 怎么办晚安角和铁陀螺 白衣服染上荧光剂了怎么办 指尖陀螺不亮了怎么办 手指陀螺不转了怎么办 月经推迟私处还老是流水怎么办 苹果手机刷机后忘记id密码怎么办 锤基意外怀孕怎么办零6 职场遇到心机婊怎么办 高二会考没过怎么办 保险柜没电了打不开怎么办 保险柜没有电了打不开怎么办 小保险箱没电了怎么办 bim墙的颜色反了怎么办 眼睛大但是无神怎么办 吃了凉的胃难受怎么办 吃凉东西胃疼怎么办 游戏只有一个分辨率选项怎么办 玩游戏心态易崩怎么办 打游戏心态炸了怎么办 赛鸽比赛回来拉稀怎么办 鸽子拉竹节水便怎么办 新买的鸽子拉稀怎么办 信鸽羽毛上长了虫子怎么办 羊肉煮熟了太硬怎么办 切菜不小心切到手指怎么办 打荷盘子端错了怎么办 学厨师不会翻锅怎么办? 在饭店上班不给工资怎么办 炒菜的左手拿不起锅怎么办?? 厨师想尽快上手炒菜怎么办? 空调吹的肩膀痛怎么办 学厨师翻锅不会怎么办 肋软骨隆鼻太硬怎么办 百度云下载速度慢怎么办 买的种子没出怎么办 铃木小r烧整流器怎么办 厨师在厨房太热怎么办