首页 > 其他分享 >918打卡

918打卡

时间:2023-09-18 17:44:22浏览次数:47  
标签:return val int length 918 TreeNode 打卡 root

1. 两数之和(1)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

思想:哈希表

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

2. 有序列表转换二叉搜索树 (109)

给定一个单链表的头节点  head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。

思想:分值,left,mid,right指针

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
/**
 * 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 {
   ListNode globalHead;

    public TreeNode sortedListToBST(ListNode head) {
        globalHead =head;
        int length = getLength(head);
        return buildTee(0,length-1);

    }

    private TreeNode buildTee(int left , int right) {
        if (left>right){
            return null;
        }

        int mid =  (left+right)/2;
        TreeNode root = new TreeNode();
        root.left = buildTee(left,mid-1);
        root.val = globalHead.val;
        globalHead = globalHead.next;
        root.right = buildTee(mid+1,right);
        return root;

    }

    private int getLength(ListNode head) {
        int ret = 0;
        while(head!=null){
            ret++;
            head =head.next;
        }
        return  ret;
    }
}

 3. 扰乱字符串 (87)

使用下面描述的算法可以扰乱字符串 s 得到字符串 t :

  1. 如果字符串的长度为 1 ,算法停止
  2. 如果字符串的长度 > 1 ,执行下述步骤:
    • 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。
    • 随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。
    • 在 x 和 y 这两个子字符串上继续从步骤 1 开始递归执行此算法。

给你两个 长度相等 的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 true ;否则,返回 false 。

思想:动态规划

显然「扰乱字符串」的关系是具有对称性的,即如果 s1是 s2的扰乱字符串,那么 s2是 s1的扰乱字符串。为了叙述方便,我们称这种情况下,s1和 s2是「和谐」的。

如果 s1=s2,那么它们是「和谐」的;如果 s1和 s2的长度不同,那么它们一定不是「和谐」的;如果 s1中某个字符 c出现了 x1次,而 c在 s2中出现了 x2次,且 x1≠x2,那么它们一定不是「和谐」的。

class Solution {
 
    int [][][] memo;
    String s1,s2;

    public boolean isScramble(String s1, String s2) {
        int length = s1.length();
        this.memo = new int[length][length][length+1];
        this.s1=s1;
        this.s2=s2;
        return dfs(0,0,length); //一开始如果不和谐,则不会进行子串比较
    }

    private boolean dfs(int i1, int i2, int length) {
        if (memo[i1][i2][length] != 0){
            return memo[i1][i2][length]==1; //如果是0 表明还么开始比较
        }
        // 判断两个子串是否相等
        if (s1.substring(i1,i1+length) .equals(s2.substring(i2,i2+length))){
            memo[i1][i2][length]=1;
            return true;
        }
        // 判断是否存在字符 c 在两个子串中出现的次数不同
        if(!checkSame(i1,i2,length)){
            memo[i1][i2][length]=-1;
            return false;
        }
        //因为两字符串长度是相同的
        // 枚举分割位置,i是切分长度
        for (int i = 1; i <length ; i++) {
            //不交换的情况, i1,i2是两个字符串的切分起始点
            if (dfs(i1,i2,i) && dfs(i1+i,i2+i,length-i)){
                memo[i1][i2][length]=1;
                return true;
            }
            //交换
            if (dfs(i1,i2+length-i,i) && dfs(i1+i,i2,length-i)){
                memo[i1][i2][length]=1;
                return true;
            }
        }
        memo[i1][i2][length]=-1;
        return false;

    }

    private boolean checkSame(int i1, int i2, int length) {
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for (int i = i1; i <i1+length ; i++) {
            char c = s1.charAt(i);
            map.put(c,map.getOrDefault(c,0)+1);
        }
        for (int i = i2; i <i2+length ; i++) {
            char c = s2.charAt(i);
            map.put(c,map.getOrDefault(c,0)-1);
        }
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            int value = entry.getValue();
            if (value!=0){
                return false;
            }
        }
        return true;

    }

}

4. 位1 的个数 (191)

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量

思想: 位操作

class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
         int num = 0;
        while (n!=0){
            num+= n&1; //只比较最后一位  011111& 00001 = 000001   011110& 00001 = 000000
            n=n>>>1; //无符号右移一位
        }
        return num; 
    }
}

5.  分裂二叉树的最大乘积

给你一棵二叉树,它的根为 root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。

由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。

思想: 深度遍历

 

   int  avg, half;// avg:整棵树总值的中间值 half:真正的中间值
    public int maxProduct(TreeNode root) {
        int total = getTotal(root); // 获取这棵树总值
        avg = total/2;
        half=total;
        //优化half 使它不断接近整棵树一半的值
        getTotal(root);
        return (int)((long)half*(total-half)%(1e9+7));

    }

    private int getTotal(TreeNode root) {

        if (root==null){
            return  0;
        }
        int val = root.val+getTotal(root.left)+getTotal(root.right);
        //遍历到当前节点 对比其它节点 更接近中间值,把节点当作树
        if (Math.abs(val-avg)<Math.abs(half-avg)){
            half =val;
        }
        return val;
    }

  

标签:return,val,int,length,918,TreeNode,打卡,root
From: https://www.cnblogs.com/forever-fate/p/17711922.html

相关文章

  • 230918 稳定与爆发
    虽然一直在亏损,但是,你认为你自己在进步的路上.但是,对于当下的你来说,进步的速度是非常重要地.你要快速的进步,然后不断的迭代.当你的交易系统的主要要求是:1.稳定 你要稳定,最好能够比较线性,接近大佬们所说的,10笔交易5平,1-2亏损,3赚.大部分的交易,都是试错,但是,不......
  • 20230916打卡
    我今天和室友一起点了披萨吃,这是我第一次尝试披萨。披萨非常好吃,我们很快就把它吃完了。下午,我花了一些时间玩原神游戏。原神超级好玩,我喜欢其中的角色和探索剧情。在游戏中,我可以放松自己,探索美丽的游戏世界,并与其他玩家一起完成任务和挑战。原神给我带来了许多乐趣和刺激。晚......
  • 大二打卡(9.15)
    今天做了什么:上午睡了个久违的懒觉,然后上了形势与政策的课,今天老师格外有热情,发了好几个课堂互动,前两个我还不知所措,没什么好回答的,到了问你的家乡或者学校周围的支柱型产业,忽然高中班主任天天念叨的安平丝网进入我的脑海,一个顺手发送出去,还引得了老师的关注,看来安平丝网有名的不......
  • 915打卡重写课前测试
    //信2205-1220223922王凌霄importjava.util.ArrayList;importjava.util.Scanner;classWarehouseInformation{privateStringitemno;//表示商品编号(有8位数字组成)。privateStringitemname;//表示商品名称privateStringsuppliername;//表示供......
  • 20230915打卡
    上午,我参加了形势与政策的学习。形势与政策是我们作为大学生应该了解和关注的重要内容,它涵盖了政治、经济、文化和社会等方面的知识。在学习中,我们深入了解了国内外的形势变化、政策规定以及重要事件的背景与影响,从而增长了对社会环境的认识。通过形势与政策的学习,我们能够更好地......
  • 打卡
    9月14日:今天我上了数据结构的课,学了链表的清空、查找、插入及其创建的两种方法,还有循环链表的运用以及双向链表的特点,学的知识点有点多,需要下课后自己去敲敲代码实践一下。明天我要把离散作业写完。......
  • 20230914打卡
    首先,我学习了UML的简要概念。UML是一种用于软件系统分析与设计的标准化语言,通过图形表示方法,可以清晰地描述软件系统的结构与行为。通过学习UML,我掌握了用例图、类图和时序图等基本图形的绘制方法,从而能够更好地理解和沟通软件系统的设计和实现。其次,我参加了篮球训练。篮球是一......
  • 914打卡_课上问题验证
    JAVA的基本运行单位是方法。程序的执行始终从main方法开始,每个独立的功能都可以通过方法来实现。类由以下组成:字段(成员变量):用于存储对象的数据。方法(成员函数):用于定义对象的行为。构造方法:用于初始化对象。初始化块:用于执行类的初始化操作。内部类:定义在其他类内部的类。变......
  • 大二打卡(9.14)
    今天做了什么:上午聚精会神的听了刘立嘉老师的课,感觉这节课终于进入重点内容了,但是感觉上了两次课还是感觉只是开了个头,体育课,本来以为排球捡球没那么累,排球没那么难,结果一个小时之后,让我腿和腰都酸了,一口气喝了半升的水过了不到二十分钟就又渴了,暑假到现在第二次感受到了汗流满面......
  • 20230913打卡
    我在今天进行了英语综合教程3第一单元的学习,并自学了蓝桥杯中的递归与递推内容。在英语综合教程3的第一单元中,我学习了许多有用的英语知识和技巧。我掌握了一些新的词汇,并学会了如何正确地使用它们。此外,我还学习了阅读和听力技巧,可以更好地理解和表达自己。通过这一单元的学习,我......