leetcode题笔记

32 阅读2分钟

最新想坚持每天刷leetcode题目,并且做相应的笔记,拓宽自己的思路,能够在工作中用到,同时记录相应笔记,希望自己能一直坚持下去!!

1、1672.最富有客户的资产总量 给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量

输入:accounts = [[1,2,3],[3,2,1]] 输出:6 解释: 第 1 位客户的资产总量 = 1 + 2 + 3 = 6 第 2 位客户的资产总量 = 3 + 2 + 1 = 6 两位客户都是最富有的,资产总量都是 6 ,所以返回 6

我的思路: 二维数组,遍历所有二维数组,求出每一个一维数组的总和,把它放到一个新的集合中,然后求这个集合的最大值。(耗时1ms,消耗空间38MB) 类似思路,定义accounts.length大小的数组,二重遍历,将数据给数组,再求数组中的最大值。

class Solution {
    public int maximumWealth(int[][] accounts) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0; i < accounts.length; i++){
            int sum = 0;
            for(int j=0; j<accounts[i].length; j++){
                sum += accounts[i][j];
            }
            list.add(sum);
        }
        return Collections.max(list);
    }
}

其他人的思路: 1、 定义一个int数,每次遍历完,进行对比,最后返回最大的数。(耗时0ms,消耗空间38.2MB)

public class Solution {
    public int maximumWealth(int[][] accounts) {
            int allSum = 0;
            for(int i = 0;i < accounts.length ;i++)
            {
                int sum = 0;
                for(int j = 0; j < accounts[0].length; j++)
                {
                    sum += accounts[i][j];
                }
                if(sum >= allSum){
                    allSum = sum;
                }
            }

        return allSum;
    }
}

2、JDK8的流式接口**(耗时5ms,耗费空间37.9MB)**

public class Solution {
    public int maximumWealth(int[][] accounts) {
        return Arrays.stream(accounts).map(ints ->
                Arrays.stream(ints).sum()
        ).max(Integer::compareTo).get();
    }

}

2、1480.一维数组的动态和 给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。

示例 1: 输入:nums = [1,2,3,4] 输出:[1,3,6,10] 解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。

我的思路: 定义一个新数组(长度和原数组一样)和一个sum,循环原来的数组,每次sum都相加一次,第一次循环直接将数据放到新数组中,后面依次存放sum,最后返回数据。 (耗时0ms,耗费内存38.4MB)

class Solution {
    public int[] runningSum(int[] nums) {
        int[] newnums = new int[nums.length];
        int sum = 0;
        for(int i = 0; i < nums.length ; i++){
            sum += nums[i];
            if(i == 0){
                newnums[0] = nums[0];
            }else{
                newnums[i] = sum;
            }
            
        } 
        return newnums;
    }
}

其他人的思路: 1、动态求和公式:temp[i] = temp[i-1] + nums[i]; (耗时0ms,耗费内存38.6MB)

class Solution {
     public int[] runningSum(int[] nums) {
         int temp[] = new int[nums.length];
         temp[0] = nums[0];
         for(int i = 1;i < nums.length ;i++){
             temp[i] = temp[i-1] + nums[i];
         }
         return temp;
     }
 }

2、改变参数的数组,代码比较简单 (耗时0ms,耗费内存38.7MB)

class Solution {
    public int[] runningSum(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            nums[i] += nums[i - 1];
        }
        return nums;
    }
}