LeetCode刷题笔记(Java)---更新至343题

文章目录

      • 前言
      • 笔记导航
      • 341.扁平化嵌套列表迭代器
      • 342.4的幂
      • 343. 整数拆分

前言

需要开通vip的题目暂时跳过

笔记导航

点击链接可跳转到所有刷题笔记的导航链接

341.扁平化嵌套列表迭代器

给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。

列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。

LeetCode刷题笔记(Java)---更新至343题_第1张图片

  • 解答

    public class NestedIterator implements Iterator<Integer> {
           
    
        private Stack<Integer> s1 = new Stack<>();
        private Stack<Integer> s2 = new Stack<>();
    
        public NestedIterator(List<NestedInteger> nestedList) {
           
            dfs(nestedList);
            while(!s1.empty()) {
           
                s2.push(s1.pop());
            }
        }
    
        @Override
        public Integer next() {
           
            return s2.pop();
        }
    
        @Override
        public boolean hasNext() {
           
            return !s2.isEmpty();
        }
    
        private void dfs(List<NestedInteger> nestedList) {
           
            for (NestedInteger temp : nestedList) {
           
                if (temp.isInteger()) {
           
                    s1.push(temp.getInteger());
                } else {
           
                    dfs(temp.getList());
                }
            }
        }
    }
    
  • 分析

    1. 深度搜索遍历给定的嵌套链表
    2. 遇到数字则直接压栈,否则递归
    3. 然后将栈中的元素出栈进另一个栈中。
    4. 之后调用next()方法只需要直接返回栈顶即可
    5. hasNext()就判断栈是否为空。
  • 提交结果
    LeetCode刷题笔记(Java)---更新至343题_第2张图片

342.4的幂

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。

LeetCode刷题笔记(Java)---更新至343题_第3张图片

进阶:
你能不使用循环或者递归来完成本题吗?

  • 解答

    		//方法一
    		public static boolean isPowerOfFour(int num) {
           
            String s = Integer.toString(num, 4);
            if (s.charAt(0) != '1') return false;
            for (int i = 1; i < s.length(); i++) {
           
                if (s.charAt(i) != '0') {
           
                    return false;
                }
            }
            return true;
        }
    		//方法二
    		public boolean isPowerOfFour(int num) {
           
        		return (num > 0) && ((num & (num - 1)) == 0) && ((num & 0xaaaaaaaa) == 0);
      	}
    		//方法三
    		public static boolean isPowerOfFour(int num) {
           
            return (num > 0) && (Math.log(num) / Math.log(2) % 2 == 0);
        }
    
  • 分析

    1. 方法一,一开始的想到的就是将num转换成4进制。这样如果是4的幂次,那么只有第一位是1,其余位为0。

    2. 方法二,在方法1的基础上,他的2进制也是满足首位为1,其余位为0。并且可以发现4的幂次和二进制(101010…10)做与运算等于0。num & 0xaaaaaaaa) == 0光这个判断还不够,因为例如5也符合条件。所以需要加上(num & (num - 1)) == 0,这个条件成立,表示仅有最高位为1.

    3. 方法三,根据数学公式推导 ,得到a是个整数即可。

    LeetCode刷题笔记(Java)---更新至343题_第4张图片

  • 提交结果

    方法一LeetCode刷题笔记(Java)---更新至343题_第5张图片

    方法二LeetCode刷题笔记(Java)---更新至343题_第6张图片

    方法三LeetCode刷题笔记(Java)---更新至343题_第7张图片

343. 整数拆分

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

LeetCode刷题笔记(Java)---更新至343题_第8张图片

  • 解答

    		// 方法一
    		int[] maxMut = new int[59];
        public int integerBreak(int n) {
           
            calMax();
            return maxMut[n];
        }
        public void calMax(){
           
            maxMut[1] = 1;
            maxMut[2] = 1;
            for(int i = 3;i<=58;i++){
           
                for(int j = 1;j<=i/2;j++){
           
                    int remain = i-j;
                    maxMut[i] = Math.max(maxMut[i],Math.max(Math.max(j * remain,maxMut[j] * remain),j * maxMut[remain]));
                }
            }
        }
    		//方法二
    		public int integerBreak(int n) {
           
            int[] dp = new int[n+1];
            dp[1] = 1;
            dp[2] = 1;
            for (int i = 3;i <= n;i++){
           
                for(int j = 1;j <= i - j;j++){
           
                    dp[i] = Math.max(dp[i],j*(i-j));
                    dp[i] = Math.max(dp[i],j*dp[i-j]);
                }
            }
            return dp[n];
        }
    		//方法三
    		int[] maxMut = new int[59];
        public int integerBreak(int n) {
           
            calMax();
            return maxMut[n];
        }
        public void calMax() {
           
            maxMut[1] = 1;
            maxMut[2] = 1;
            for (int i = 3; i <= 58; i++) {
           
                maxMut[i] = Math.max(Math.max(2 * (i - 2), 2 * maxMut[i - 2]), Math.max(3 * (i - 3), 3 * maxMut[i - 3]));
            }
        }
    
  • 分析

    1. 方法一记忆集搜索

    2. 将每个数字可以得到的最大乘机缓存下来。

    3. 遍历3~58,每个数字进行拆分成j和remain,得到的结果最大值有2种情况

      1. j * remain 拆分后的乘积为最大
      2. j * matMut[remain] 剩余部分继续拆分后的乘积更大
    4. 方法二

    5. 参考方法一写成dp的形式。

    6. 方法三

    7. 在第一个方法上的改进,每次数字拆分仅要考虑拆成2和i-2 或3和i-3即可。

  • 提交结果

    方法一LeetCode刷题笔记(Java)---更新至343题_第9张图片

    方法二LeetCode刷题笔记(Java)---更新至343题_第10张图片

    方法三LeetCode刷题笔记(Java)---更新至343题_第11张图片

你可能感兴趣的:(#,LeetCode刷题笔记,leetcode,数据结构,java)