• 11.26


    目录

    一.做题出错

    1.

    2.数组长度的一半

    3.选择题

    二.优先级队列(堆)

    1.二叉树的顺序存储

    1.1 存储方式

    1.2下标关系

    2.堆(heap)

    2.1概念

    2.2 操作-向下调整

    三 建堆

    四.优先级队列

    1 概念

    2 内部原理

    3.操作-入队 offer()

    4.操作-出队

    五.计算糖果


    一.做题出错

    1.

    如果直接返回null.会空指针异常

    并且一开始我用的是LinkedList 会显示没用这个方法

    因为只有ArrayLIST才有

    2.数组长度的一半

    利用众数和非众数消除原则

    相同次数定义为1

    定义一个后驱为0下标.从1下标开始遍历.如果相同就time++;如果不相同就减减

    如果相同次数为0.就把后驱定义为新 的下标

    1. import java.util.*;
    2. public class Solution {
    3. public int MoreThanHalfNum_Solution (int[] numbers) {
    4. // write code here
    5. if(numbers==null||numbers.length==0) return 0;
    6. int time=1;
    7. int pre=numbers[0];
    8. for(int i=1;i
    9. if(time!=0){
    10. if(pre==numbers[i]){
    11. time++;
    12. }else{
    13. time--;
    14. }
    15. }else{
    16. pre=numbers[i];
    17. time++;
    18. }
    19. }
    20. return pre;
    21. }
    22. }

    3.选择题

    b选项.接口里的方法都是为了被重写

    私有化怎么被重写

    子类的重写方法访问权限要大于等于父类的

    Iterator是个迭代器.没有关系

    final不能被重写.

    void也不可以

    都是关键字

    1.System.arraycopy()

    2.Arrays.copyof()

    3.clone(

    (13条消息) 如何在Java中复制/克隆数组_allway2的博客-CSDN博客_java 数组克隆

    无参数的构造方法隐式调用super.所以当写了无参数的构造方法,有参数的就不需要显示调用

    但是没有些无参的,就需要显示调用super

    当父类无对应的就不需要用super帮助父类构造

    但是如果你重写了构造法方法.那么无参的构造方法就会消失,所以这里就会显示报错.显示父类没有

    二.优先级队列(堆)

    1.二叉树的顺序存储

    1.1 存储方式

    使用数组保存二叉树结构,方式即将二叉树用层序遍历方式放入数组中。

    一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。

    这种方式的主要用法就是堆的表示。

    1.2下标关系

    已知双亲(parent)的下标,则:

    左下标(left)下标=2*parent+1;

    右下标(right)下标=2*parent+2

    已知孩子(不区分左右)(child)下标,则:

    双亲(parent)下标 = (child - 1) / 2

    2.堆(heap)

    2.1概念

    1.堆逻辑上是一颗完全二叉树

    2.堆物理上是保存在数组中

    3满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆

    4反之,则是小堆,或者小根堆,或者最小

    1. 堆的基本作用是,快速找集合中的最值

    2.2 操作-向下调整

    1.调整的开始就是从最后一课子树处罚的

    2.每颗子树的调整都是向下调整的

    2.3操作-向上调整

    插入元素的时候,是放在数组结尾也就是最后一个

    然后开始向上检查

    三 建堆

    我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调整成堆。

    1. public class TestHeap {
    2. int[]elem;
    3. int usedSize;
    4. public TestHeap(){
    5. elem=new int[10];
    6. }

    因为堆的底层是数组构成的

    但是如果是一颗堆必须要是大根堆或者是小根堆,这里我们用大根堆表示

    1. public void createHeap(int[] arr){
    2. elem= Arrays.copyOf(arr,arr.length);
    3. usedSize=arr.length;
    4. for (int parent=(usedSize-1-1)/2;parent>=0;parent--){
    5. shiftDown(parent,usedSize);//每一个都调整,从下网上调整
    6. }
    7. }

    我们放入数组.但是需要调整,这里我们就开始向下调整,从最后一个元素开始,把最后一个元素的父亲结点传过去

    1. public void shiftDown(int parent,int len){//向下调整
    2. int child=2*parent+1;
    3. while(child
    4. //防止数组越界.如果没有右孩子.就不能往右加
    5. if(child+11]){
    6. child++;//保证左右孩子最大值的下标
    7. }//但是没有改变原有树的结构
    8. if(elem[child]>elem[parent]){
    9. int tmp=elem[child];
    10. elem[child]=elem[parent];
    11. elem[parent]=tmp;//交换
    12. //但是防止交换后下面的出现问题
    13. parent=child;//向下检查
    14. child=2*parent+1;//因为在这边改变的树的结构.所以需要检查
    15. }else{//假如是向下转型第二次到这,就说明上次的还是大.就可以直接跳出了
    16. break;//这次传递的parent没问题已经是大根堆
    17. }
    18. }
    19. }

    这里的时间复杂度,一般认为就是数组的高度因为一直往下检查所以就是O(logn);

     

    调整高度

    如果是第一层就需要调整h-1次

    如果是第二层就需要调整h-2次

    .

    .

    ..

    .如果是倒数第二层就需要调整一次,这是最坏的情况

    把这个表达式乘以2错位相减

    • log(n+1)会趋近于常数
    • 所以时间复杂度就是n

    四.优先级队列

    priorityQueue

    1 概念

    在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次

    高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。

    在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这

    种数据结构就是优先级队列(Priority Queue)

    2 内部原理

    优先级队列的实现方式有很多,但最常见的是使用堆来构建

    3.操作-入队 offer()

    入队的方式是向上调整

    先放在最后一个元素,然后一个一个往上调整

    1. public void shiftUp(int child){
    2. int parent =(child-1)/2;
    3. while(child>0){//检查到最上面也就是child移到0下标.
    4. /* if(child+1
    5. break;
    6. }*/
    7. if(elem[child]>elem[parent]){
    8. int tmp=elem[child];
    9. elem[child]=elem[parent];
    10. elem[parent]=tmp;//交换
    11. child=parent;
    12. parent=(child-1)/2;//向上检查
    13. }else{
    14. break;//因为已经是一个完整的大根堆了,只要有一个满足就不需要再检查了
    15. }
    16. }
    17. }
    18. public void offer(int val){
    19. if(isFull()){
    20. //扩容
    21. elem=Arrays.copyOf(elem,elem.length*2);
    22. }
    23. elem[usedSize++]=val;
    24. shiftUp(elem[usedSize-1]);//把要放的元素放到最后的位置,然后向上调整
    25. }

    4.操作-出队

    因为出的就是0号下标,就让0号和最后一个交换,然后删除最后一个,只要让usedsize--即可.在让0号下标向下调整即可

    1. public int poll(){
    2. if(isEmpty()){
    3. throw new RuntimeException("堆为空");
    4. }
    5. int tmp=elem[0];
    6. elem[0]=elem[usedSize-1];
    7. elem[usedSize-1]=tmp;
    8. usedSize--;
    9. shiftDown(0,usedSize);
    10. return tmp;
    11. }
    12. public boolean isEmpty(){
    13. return usedSize==0;
    14. }

    五.计算糖果

    这个题目如果不考虑存不存在就只要互相加就可以消除得到

    但是这里又说就是可能不满足

    我们发现

    ac表达式只有A和B

    bd表达式只有B和C

    共同是B

    所以我们只要看通过ac计算出来的B和bd计算的B相不相同如果不相同那就说明不存在

    1. public class Main {
    2. public static void main(String[] args) {
    3. Scanner in = new Scanner(System.in);
    4. // 注意 hasNext 和 hasNextLine 的区别
    5. while (in.hasNextInt()) { // 注意 while 处理多个 case
    6. int a = in.nextInt();//A-B
    7. int b = in.nextInt();//B-C
    8. int c= in.nextInt();//A+B
    9. int d= in.nextInt();//B+C
    10. int A=(a+c)/2;
    11. int B=(c-a)/2;
    12. int B1=(b+d)/2;
    13. int C=(d-b)/2;
    14. if(B==B1){
    15. System.out.println(A +" "+B+" "+C);
    16. }else{
    17. System.out.println("No");
    18. }
    19. }
    20. }
    21. }

  • 相关阅读:
    odata expand
    解决 80% 的工作场景?GitHub 爆赞的 Java 高并发与集合框架,太赞了
    OpenHarmony 4.1计划明年Q1发布, 5.0预计Q3发布
    2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策
    【智能家居入门2】(MQTT协议、微信小程序、STM32、ONENET云平台)
    2023最新UI工作室官网个人主页源码/背景音乐/随机壁纸/一言
    golang实现远程控制主机
    [python][flask] Flask 入门(以一个博客后台为例)
    JavaScript入门——(2)基础语法(上)
    Laravel Macroable
  • 原文地址:https://blog.csdn.net/m0_72618437/article/details/128059383