0
点赞
收藏
分享

微信扫一扫

每日刷题记录 (十七)

墨香子儿 2023-11-17 阅读 37

文章目录

第一题: 剑指 Offer 33. 二叉搜索树的后序遍历序列

LeetCode: 剑指 Offer 33. 二叉搜索树的后序遍历序列

描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

在这里插入图片描述

解题思路:

代码实现:

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        Stack<Integer> stack = new Stack<>();
        int root = Integer.MAX_VALUE;
        for(int i = postorder.length - 1; i >=0 ;i--) {
        	// 如果这里的root被标记了(进入左树), 比较是否这个值大于根据节点
            if(postorder[i] > root) {
                return false;
            }
            // 只要这里小于栈顶元素, 弹出栈顶元素, 相当于把右树弹出.
            while (!stack.isEmpty() && postorder[i] < stack.peek()) {
            	// 标记新的根节点
                root = stack.pop();
            }
            stack.push(postorder[i]);
        }
        return true;
    }
}

第二题: 剑指 Offer 34. 二叉树中和为某一值的路径

LeetCode: 剑指 Offer 34. 二叉树中和为某一值的路径

描述:
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

在这里插入图片描述
在这里插入图片描述

解题思路:

代码实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int target) {
        dfs(root,target);
        return res;
    }
    public void dfs(TreeNode root, int target){
        if(root == null) return;
        list.add(root.val);
        target -= root.val;
        if(target == 0 && root.left == null && root.right == null) {
            res.add(new ArrayList<>(list));
        }else{
            dfs(root.left,target);
            dfs(root.right,target);
        }
        list.remove(list.size()-1);
    }
}

第三题: 剑指 Offer 35. 复杂链表的复制

LeetCode: 剑指 Offer 35. 复杂链表的复制

描述:
请实现 copyRandomList函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null
在这里插入图片描述
在这里插入图片描述

解题思路:

代码实现:

class Solution {
    public Node copyRandomList(Node head) {
        Node cur = head;
        Map<Node,Node> map = new HashMap<>();
        while(cur != null) {
            map.put(cur,new Node(cur.val));
            cur = cur.next;
        }
        cur = head;
        while(cur != null) {
        	// 注意这里的链接方法.
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        return map.get(head);
    }
}

第四题: 剑指 Offer 38. 字符串的排列

LeetCode: 剑指 Offer 38. 字符串的排列

描述:
输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
在这里插入图片描述

解题思路:

代码实现:

class Solution {
    List<String> list = new ArrayList<>();
    public String[] permutation(String s) {
        boolean[] tmp = new boolean[s.length()];
        char[] ch = s.toCharArray();
        // 注意题目中没有说s是不重复的,所以需要排序
        Arrays.sort(ch);
        bfs(ch,tmp,new StringBuilder());
        String[] ans = new String[list.size()];
        for(int i = 0; i < list.size(); i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }
    public void bfs(char[] ch, boolean[] tmp,StringBuilder sb){
        if (sb.length() == ch.length) {
            list.add(sb.toString());
            return;
        }
        for(int i = 0; i < ch.length; i++) {
        	// 剪枝1
            if(i > 0 && ch[i] == ch[i-1] && tmp[i-1]){
                continue;
            }
            // 剪枝2
            if(tmp[i]){
               continue; 
            }
            tmp[i] = true;
            sb.append(ch[i]);
            bfs(ch,tmp,sb);
            sb.deleteCharAt(sb.length()-1);
            tmp[i] = false;
        }
    }
}

第五题: 剑指 Offer 42. 连续子数组的最大和

LeetCode: 剑指 Offer 42. 连续子数组的最大和

描述:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。
在这里插入图片描述

解题思路:

代码实现:

class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = nums[0];
        for(int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(nums[i],dp[i-1]+nums[i]);
            max = Math.max(dp[i],max);
        }
        return max;
    }
}

第六题: 剑指 Offer 44. 数字序列中某一位的数字

LeetCode: 剑指 Offer 44. 数字序列中某一位的数字

描述:
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。
在这里插入图片描述

解题思路:

范围位数数据量所有的数位量
1 ~ 9199
10 ~ 99290180
100 ~ 99939002700
start ~ start*10-1digit9 * start9 * digit * start

代码实现:

class Solution {
    public int findNthDigit(int n) {
        int digit = 1;
        // 因为范围过大, 还涉及到乘法, 要考虑溢出使用long
        long count = 9;
        long start = 1;
        while(n > count) {
            n -= count;
            digit++;
            start *= 10;
            count = digit * start * 9;
        }
        // 得到原来的数
        long num = start + (n - 1) / digit;
        String ans = num+"";
        // 根据这个数转成字符串, 来得到该位下的值.
        return ans.charAt((n - 1) % digit) - '0';
    }
}
举报

相关推荐

0 条评论