LeetCode算法笔记(简单篇01)

该系列算法学习笔记的思路和代码示例均是一般解法,如有更好解法欢迎讨论

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

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

思路:

一般数组求和都是循环+累加,题目要求结果是当前元素及其前面所有元素之和,则我们可以把当前元素作为分界线,用当前元素加上前一个元素(前一个元素因为循环,本身已经等于本身加上之前元素之和,以此类推…)

参考答案:
class Solution {
    public int[] runningSum(int[] nums) {
        int[] t = new int[nums.length];
        t[0] = nums[0];
        for(int i = 1;i<nums.length;i++){
        	//这里不要手快把nums[i-1]写成nums[i],t本身才是相加后的结果,我们是要把nums不断加过来
            t[i] = t[i-1] + nums[i];
        }
        return t;
    }
}

题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

如输入: s = “abcdefg”, k = 2
输出: “cdefgab”

思路:

假如输入数字n,则从n位开始循环,把n后面所有的字符先添加到一个新的字符串中 ,再从0开始循环,以n为终点,把前n位数追加到新字符串中。
leetcode解题区有位大佬给出取余法,for(int i = n;i < n + s.length();i++){sb.append(s.charAt(i % s.length()))}

参考答案:
class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb = new StringBuilder();
        for(int i = n;i < s.length();i++){
            sb.append(s.charAt(i));
        }
        for(int j = 0;j < n;j++){
            sb.append(s.charAt(j));
        }
        return sb.toString();
    }
}

题目三:给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目

如输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始

思路:

一般双循环,第二层循环所得元素和第一层循环元素做对比,即先循环到第一个数,然后遍历后面剩下的数并进行对比即可,以此类推

参考答案:
class Solution {
    public int numIdenticalPairs(int[] nums) {
        int n=0;
        for(int i = 0;i<nums.length;i++){
            for(int j = i +1;j<nums.length;j++){
                if(nums[i]==nums[j]){
                    n++;
                }
            }
        }
        return n;
    }
}

题目四:给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目

输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true]
解释:
孩子 1 有 2 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 2 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 3 有 5 个糖果,他已经是拥有最多糖果的孩子。
孩子 4 有 1 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 5 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。

思路:

先用Math.max得出最大值,然后判断最大值是否小于等于当前元素+差值

参考答案:
class Solution {
    public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
        int max = 0;
        for(int i = 0;i<candies.length;i++){
            max = Math.max(max,candies[i]);
        }
        List<Boolean> l = new ArrayList<Boolean>();
        for(int i = 0;i<candies.length;i++){
            l.add(candies[i]+extraCandies >= max);
        }
        return l;
    }
}

题目五:小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。

输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了

思路:

代码即思路(ps:其实看了题目个人感觉应该是产生两个0~2之间的随机数来代表随机从两个数组中随机获取数字,再进行比较,double d = Math.random;int i = (int)(d*3)

参考答案:
class Solution {
    public int game(int[] guess, int[] answer) {
        int count = 0;
        for(int i = 0;i<answer.length;i++){
            if(answer[i] == guess[i]){
                count++;
            }
        }
        return count;
    }
}

题目五:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。

思路:

递归,不断地递归左右子树,再调用Math.max找出最大值加一(根),即树的深度

参考答案:
class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值