IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构和算法(2)断更一段时间,寒假开始更新 -> 正文阅读

[数据结构与算法]数据结构和算法(2)断更一段时间,寒假开始更新

目录

查找最大值

归并排序O(nlgn)

小和问题


查找最大值

利用二分查找通过递归来找最大值

首先将数组通过中间元素arr[mid]将数组分为两个部分,两个部分分别递归,直到找到最大值

本质是一个多叉树,在计算树的所有的节点的时候,利用栈玩了一个后序遍历,每一个节点都通过自己的子节点给自己汇总信息之后才能够继续向上返回,栈空间就是整棵树的高度只需要在一个高度上进行压栈,这就是一个递归的过程

代码

public class Code6_getMax {
    public static int getMax(int[] arr) {
        return process(arr,0,arr.length-1);
    }//master公式
    public  static int process(int[] arr,int l,int r){
        if(arr.length==1){
            return arr[l];
        }
        int mid=l+((r-l)>>1);
        int lMax= process(arr,l,mid);
        int rMax=process(arr,mid+1,r);
        return Math.max(lMax,rMax);
    }
}

master公式

只要满足子问题具有相同规模的递归都可以用master公式

?总结

归并排序O(nlgn)

可以运用master公式来求解

左边先排好序,右边先排好序,左右merge在一起,整体就有序了

每一次的比较行为没有被浪费,每次比较最后会变成一个新的有序的数组,这种变成了有序的的东西,信息是往下传递的,正式因为这样它变成了O(n*lgn)

代码

public class Code7_mergeSort {
    public static void mergeSort(int[] arr){
        if(arr.length<2||arr==null){
            return ;
        }
        process(arr,0,arr.length);
    }
    public static void process(int[] arr,int l ,int r){
        if(l==r){
            return ;
        }
        int mid=l+((r-l)>>1);
        process(arr,l,mid);
        process(arr,mid+1,r);
        merge(arr,l,mid,r);
    }
    public static void merge(int[] arr,int l,int mid,int r){
        //左边已经有序,右边已经有序,通过merge使两边同时有序
        int[] help=new int[r-l+1];
        int i=0;
        int p1=l;
        int p2=mid+1;
        while(p1<=mid && p2<=r){
            help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];

        }
        while(p1<=mid){
            help[i++]=arr[p1++];
        }
        while(p2<=r){
            help[i++]=arr[p2++];

        }

        for(int ii=0;ii<help.length;ii++){
            arr[l+ii]=help[ii];
        }

    }
}

小和问题

1 3 4 2 5

1的左边没有比1小的数,所以小和为零

3的左边有1,所以小和是1

4的左边有3和1 ,所以小和是4

2的左边是1,小和是1

5的左边是1 3 4 2 所以小和是10

所以整个数组的小和是16

暴力解决很轻松,两层for循环就解决了,只不过时间复杂度是O(n2)

我们可以换一种思路来解决这个问题

看被查看的数字的右边有几个比他大的,有几个就算这个出现几次小和

如? 1 出现的次数是4次

3出现的次数是2次

4出现的次数是1次

2出现的次数是1次

5出现的次数是0次

加起来也是16

所以这个可以用归并排序来进行解决

又与归并排序有一点不同,当左边的数等于右边的数的时候将左边的数放进外排序的数组里面,如果不这样做,就会不知道右边有多少个数比左边与右边相等的那个数大

?代码

public class Code8_SmallSum {
    public static int smallSum(int[] arr){
        if(arr.length==0||arr==null){
            return 0;
        }
        return mergeSort(arr,0,arr.length-1);

    }
    public static int mergeSort(int[] arr,int l,int r){
        if(l==r){
            return 0;
        }
        int mid=l+((r-l)>>1);
        return mergeSort(arr,l,mid)
                +mergeSort(arr,mid+1,r)
                +merge(arr,l,mid,r);



    }
    public static int merge(int[] arr,int l,int mid,int r){
        int[] help=new int[r-l+1];
        int i=0;
        int p1=l;
        int p2=mid+1;
        int ret=0;
        while(p1<=mid&&p2<=r) {
            ret += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p2] : 0;
            help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while(p1<=mid){
            help[i++]=arr[p1++];
        }
        while(p2<=r){
            help[i++]=arr[p2++];
        }
        for(int j=0;j<help.length-1;j++){
            arr[l+j]=help[j];

        }
        return ret;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:43:35  更:2021-10-12 23:46:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:37:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码