基础算法学习

文章目录

    • 快速排序
    • 归并排序
    • 二分
      • 浮点数二分
    • 高精度
      • BigInteger
      • BigDecimal
    • 前缀和
    • 差分
    • 双指针
    • 位运算
    • 离散化
    • 区间合并

快速排序

  1. 确定分界点x (可以是左边界,右边界,中间随机)
  2. 将小于等于x的数放到左边,大于等于x的放右边
  3. 递归处理左右两端

如何处理第二步:

双指针法

模版:

public static void quickSort(int[]arr,int l,int r) {if(l >= r) {return;}int x= arr[l+r>>1];   //arr[l+r+1>>1] 后面递归要用iint i = l - 1;  //初始左指针位置int j = r + 1;  //初始右指针位置while(j > i) {do i++; while(arr[i] < x);   //先将左指针向右移,在判断底下这个数是不是小于x的,是就继续右移do j--; while(arr[j] > x);   //先将右指针向左移,再判断底下这个数是否大于x,是就继续左移if(j > i) swap(arr[i],arr[j]); //只有在下标满足条件的情况下才交换}quickSort(arr,l,j);   //这里递归的边界取i还是j,与x取右边界还是左边界有关quickSort(arr,j + 1,r); //x如果取的左边界,所以递归边界一定要用j,反之,一定要用i/**quickSort(arr,l,i - 1);quickSort(arr,i,r);*/
}

最后结果可能是 i = j j < i

归并排序

  1. 以数组下标中间点为分界点
  2. 递归排序左边和右边
  3. 归并,合二为一

如何将这两个有序的序列合二为一:

双指针法:

直到有一条序列 到了底,没到底的序列剩下那部分直接接在结果序列后面即可

时间复杂度:nlog(n)

总共有logn层,每层时间复杂度都是On的,所以总时间复杂度为nlogn、

快排同理,虽然每次不一定是平分的,但是期望是平分的

模版:

public static void merageSort(int[]a,int l,int r) {if(l >= r) return;int mid = l + ((r - l) >> 1);merageSort(a,l,mid);merageSort(a,mid+1,r);int[]temp = new int[r - l + 1];int k = 0;  //记录temp数组的元素int i = l;  //第一条序列开始的指针int j = mid + 1; //第二条序列开始的指针while(i <= mid && j <= r) {if(a[i] <= a[j]) temp[k++] = a[i++];else temp[k++] = a[j++];}//两指针谁没走到头,就继续将剩下的接在temp后面while(i <= mid) temp[k++] = a[i++];while(j <= r) temp[k++] = a[j++];//最后将得到的排好序的数组赋值给原来的for(i = l,j = 0;i <= r;i++,j++) {a[i] = temp[j];}
}

二分

模版:

while(l < r) {int mid = l + r >> 1;if(check(mid)) r = mid;else l = mid + 1;
}while(l < r) {int mid = l + r + 1 >> 1;if(check(mid)) l = mid;else r = mid - 1;
}

先根据check函数判断处理结果是什么,再根据处理结果判断mid是否要补充加1

这里l 和 r最后结果都是一样的

浮点数二分

不需要考虑边界问题

public class Main{public static void main(String[]args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));double f = Double.parseDouble(br.readLine());double l = 0;double r = Math.abs(f);//如果要保留4位小数,写1e-6  保留5位 1e-7  经验值  比要求的多两位//这里也可以不管就直接循环100次来代替用精度表示的迭代while(r - l >= 1e-8) {double mid = (l + r) / 2;if(mid * mid * mid >= Math.abs(f)) r = mid;else l = mid;}if(f >= 0) System.out.println(String.format("%.6f",r));else System.out.println("-"+String.format("%.6f",r));}
}

高精度

超过int的值 10的九次方

超过long的值 10的18次方

BigInteger

public BigInteger(int num,Random rnd)  //获取随机大整数,范围0~ 2的num次方-1
public BigInteger(Stirng val)
public BigInteger(String val,int radix)  //获取指定进制大整数public static BigInteger valueOf(long val)  //内部有优化,但超过long范围就不行了//在内部对-16~16提前创建好了对象

对象一旦创建不能被改变,如果进行add,等操作,会产生新的BigInteger对象记录

add
subtract
multiply
divide   #除法,获取商
divideAndRemainder(BigInteger val)  #除法,获取商和余数,放在一个数组中返回
pow(int e) #次幂
max/min(BigInteger val)
intValue(BigInteger val) #转成int类型数据,超出范围数据有误

BigDecimal

public BigDecimal(double val)
public BigDecimal(String val)public static BigDecimal valueOf()
# 对于0~10之间的整数,包含0 10 ,方法会返回已经创建好的对象,不会重新new
add
subtract
multiply
divide
BigDecimal divide(BigDecimal val,精确几位,舍入模式)
#舍入模式
四舍五入:RoundingMode.HALF_UP
其他在RoundingMode类中找即可

前缀和

就是再定义一个长度和要存放数据的数组(a)等长的数组(s),在初始化存放数据数组时,将这个数组也初始化,每个位置存放前一个位置(s[i - 1])和 a[i] 的和

其中a数组和s数组下标最好都从1开始,这样在初始化前缀和数组时,是s[i] = s[i - 1] + a[i] 这里的i - 1,就不用单独判断

差分

差分就是前缀和的逆运算,

作用:

可以用O1的时间复杂度,给原数组某个区间加上一个固定的值

处理:

如果想让数组[l , r] 区间的数都加上c,那么让diff[l] + c , 让 diff[r + 1] - c 即可

核心:

构造差分数组不是核心,差分数组的构造可以看做,将元素一个一个按照规则添加进一个全为0的差分数组中,核心是添加进差分数组的规则

  • 一维差分

    /*** 要添加数的区间 1 ~ r* 要添加的值*/
    public static void insert(int[]a,int l,int r,int c) {a[l] += c;a[r+1] -= c;
    }
    
  • 二维差分

    /*** 要添加数的区间 x1,y1  ~ x2,y2* 要添加的值  c*/
    public static void insert(int[][]d,int x1,int y1,int x2,int y2,int c) {d[x1][y1] += c;d[x2 + 1][y1] -= c;d[x1][y2 + 1] -= c;d[x2 + 1][y2 + 1] += c;
    }
    

双指针

所有双指针算法都是On的

模板:

for(i = 0,j = 0;i < n;i++) {while(j < i && check(i,j)) j++;//每道题目具体逻辑
}

核心思想:

for(int i = 0;i < n;i++) {for(int j = 0;j < n;j++) {}
}
//O(n^2)

将上面的枚举i,枚举j,优化到On级别

位运算

x = 10 n = 1010 (二进制表现形式)

源码:0……01010

反码:1……10101

补码:反码+1 1……10110

  • 求n的二进制表示中第k位是几

    # 将n右移k位,再&1
    n >> k & 1
    
  • lowbit 操作:返回x的最后一位1,lowbit最高一位1,就是x最低一位1

    x & -x
    

    可以用来统计x中1的个数:每次将最后一个1去掉,减了几次就说明有几个1

离散化

在这里插入图片描述

基本含义:

对于值域较大,而个数相对较少的一组数据 a[ ] ,例如 值域 0~10^9 个数 :5

我们需要用到他的值作为下标,开一个10^9的数组显然不合理

所以我们需要将他映射到一个从0开始的连续的数组中(将他的值映射成下标),这个过程称为离散化

a[] 数组应该是有序的,整个过程要保序的进行

  • 其中a数组可能存在重复元素,需要去重
  • 如何算出a[i] 离散化后的值 (二分 找到第一个大于等于x的位置,即找右边界)

例题:

acwing:802 区间和

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。

现在,我们首先进行 n次操作,每次操作将某一位置 x 上的数加 c。

接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。

输入格式
第一行包含两个整数 n和 m。

接下来 n行,每行包含两个整数 x和 c。

再接下来 m行,每行包含两个整数 l和 r。

输出格式

共 m行,每行输出一个询问中所求的区间内数字和。

数据范围

−10^9 ≤x≤ 10^9,
1≤n,m≤10^5,
−10^9≤ l ≤r ≤ 10^9,
−10000≤c≤10000

分析:

区间和这种题目对于数据量较少的可以直接使用前缀和,本题数据量较大,先进行离散化处理再使用前缀和

将需要用到的下标记录下来,将这些不连续的下标想办法映射成连续的数字(将这些下标排完序后返回下标对应索引即可,可以用indexOf,但是效率较低可能超时,最好用二分查找)

这里x的范围是 -10的九次方到10的九次方 ,而需要用到的下标数量最多为 n + 2m (添加的时候访问n次下标,询问的时候一次访问两个,就是2m)也就是30万,符合离散化的特性

区间合并

给多个区间,如果区间之间有交集的话,将他们合并成一个区间

处理方式:

先将所有区间以左端点从大到小排序,维护一个以st 开头,ed 结尾的区间 x,遍历所有区间

如果遍历到的区间 item,起始点大于x的ed,说明当前维护区间和后面的区间没有关系,合并完成一个区间,否则比较两区间的ed,将较大的那个作为当前维护区间的ed

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广州华锐视点:3D毒品预防专题教育平台帮助青少年提升拒毒意识

随着科技的不断发展&#xff0c;人们的生活方式也在不断地改变。在这个信息爆炸的时代&#xff0c;传统的普法教育方式已经无法满足人们的需求。为了适应这一变化&#xff0c;越来越多的教育机构开始尝试利用现代科技手段进行普法教育。其中&#xff0c;3D毒品预防专题教育平台…

跨界融合,科技耕耘:MTX基金公司与ICG共塑全球农业科技新景观

在全球经济快速发展的当下&#xff0c;农业科技创新成为了社会进步的重要推动力。MTX基金公司对ICG的投资是在这一背景下的战略决策&#xff0c;不仅寻求经济效益&#xff0c;更承载着改善全球农业生产、实现食品安全与环境保护的使命。 1、战略投资&#xff1a;文化情怀与全球…

开发知识点-Maven包管理工具

Maven包管理工具 SpringBootSpringSecuritydubbo图书电商后台实战-环境设置&#xff08;JDK8, STS, Maven, Spring IO, Springboot&#xff09;点餐小程序Java版本的选择和maven仓库的配置视频管理系统&&使用maven-tomcat7插件运行web工程SpringTool suite——maven项目…

vue2常见的语法糖

Vue.js 2 提供了一些语法糖&#xff08;syntactic sugar&#xff09;来简化常见的操作。以下是一些 Vue.js 2 中常用的语法糖&#xff1a; v-bind 简写&#xff1a; <!-- 完整语法 --> <a v-bind:href"url">Link</a><!-- 简写 --> <a :hr…

【MySQL数据库】SQL查询语句总结

目录 一、查询数据 1.1 基本查询语句 1.2 表单查询 1.3 WHERE子句 1.3.1 IN关键字查询 1.3.2 Between查询范围 1.3.3 Like匹配查询 1.3.4 AND多条件查询&#xff08;等同于&&&#xff09; 1.3.5 OR多条件查询&#xff08;等同于||&#xff09; 1.3.6 LIMIT子句 1.3.7 对…

tsx语法

安装JSX库 安装完之后在vite.config.ts进行插件使用&#xff0c;代码如下&#xff1a; 然后就可以愉快的使用TSX来开发Vue组件了&#xff0c;下面主要说一下SFC和TSX的部分区别。 基本语法对照 defineComponent 和 setup setup中函数的返回值有多种方式&#xff0c;可以直接…

vuepress-----9、PWA

# 9、PWA 使用babel 的插件形式 [vuepress/pwa,{serviceWorker: true,updatePopup: {message: "New content is available.",buttonText: "Refresh"}}]提供 Manifest 和 icons (opens new window) 拷贝到public目录下 发布后出现 service workers [外链图片…

Apache Flink(二):数据架构演变

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

promis.all的异步使用

基础 参考 https://blog.csdn.net/qq_52855464/article/details/125376557 简单来说 Promise.all是处理接口返回方法异步的&#xff0c;能够使得接口的获取顺序得到控制&#xff0c;不会出现数据为空的情况 使用 先执行jianshigetGroups->groupIds-> const promises2 …

docker搭建rabbit集群

1.去rabbitMQ官网拉去images 我当前使用的是最新版本的镜像&#xff1a;rabbitmq:3.12-management 2.创建一个集群专用网络 docker的容器相互隔离是不可通信的&#xff0c;我们自行创建一个网络后&#xff0c;创建容器时 给他们放在一起&#xff0c;就可以通信了。 docker netw…

【LabVIEW学习】3.labview制作安装程序

一。生成exe文件 1.创建可执行文件 &#xff08;1&#xff09;创建项目 注意&#xff1a; 1.创建.exe文件&#xff0c;这个文件在labview环境下才可以运行&#xff0c;如果直接传递给其他电脑&#xff08;没有labview环境&#xff09;&#xff0c;他是不可以运行的。 2.如果已…

创建SpringBoot流程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、操作步骤总结 前言 我使用的是jdk1.8版本的&#xff0c;idea社区版的&#xff08;专业版的应该也差不多吧&#xff09; 提示…

华清远见嵌入式学习——C++——作业2

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Rect { private:int width;int height;public:void init(int w,int h);void set_w(int w);void set_h(int h);void show(); };void Rect::init(int w,int h) {width w;height h;…

记一次:Python的学习笔记一

前言&#xff1a;之前学习的Python笔记&#xff0c;已经过去很多年了&#xff0c;不久前重新翻了出来练习练习。不完善的地方在缝缝补补 一、环境搭建 1.1、Python的win环境安装 0、python-3.12.0软件安装&#xff1a;Win11环境搭建python-3.12.0-amd64 这里小小注意一下&a…

vuepress-----3、导航栏

3、导航栏 # 页面目录结构约定 . ├── docs │ ├── .vuepress (可选的) │ │ ├── components (可选的) │ │ ├── theme (可选的) │ │ │ └── Layout.vue │ │ ├── public (可选的) │ │ ├── styles (可选的) │ │ │…

身份证mod11-2校验规则

这几天碰到一个需求是实现身份证最后一位的校验&#xff0c;需求文档里面写了个公式&#xff0c;没看懂&#xff08;数学早就还给老师了&#xff09;&#xff0c;于是各种查资料&#xff0c;发现网上的资料要么只给了说明&#xff0c;要么给了个固定的代码&#xff0c;但是写的…

怎样将Halcon导出的数据显示在textBox中

其中textBox1是文本框的名字&#xff0c;hv_Row时一个数组&#xff0c;.D.我的理解是DATA,即数据的意思&#xff0c;“0.00”是显示的数值保留两位小数点的意思。

数据库系统概述之数据库优化

为什么需要进行优化&#xff1f; 数据库性能瓶颈 数据库服务器的性能受许多因素影响&#xff0c;包括硬件能力、系统规模、业务模型及架构、代码设计、数据库表设计、系统环境等。 因此&#xff0c;可以从几个方面进行数据库优化 喜欢点赞收藏&#xff0c;如有疑问&#xff…

RabbitMQ快速学习之WorkQueues模型、三种交换机、消息转换器(基于SpringBoot)

文章目录 前言一、WorkQueues模型消息发送消息接收能者多劳 二、交换机类型1.Fanout交换机消息发送消息接收 2.Direct交换机消息接收消息发送 3.Topic交换机消息发送消息接收 三、编程式声明队列和交换机fanout示例direct示例基于注解 四、消息转换器总结 前言 WorkQueues模型…

关键词挖掘软件-免费批量挖掘关键词的工具

在当今数字化时代&#xff0c;网站的曝光和排名对于吸引流量至关重要。而在这个大数据的背后&#xff0c;SEO&#xff08;Search Engine Optimization&#xff0c;搜索引擎优化&#xff09;成为许多网站主和创作者们追逐的关键。在SEO的世界里&#xff0c;关键词的选择和优化是…