剑指Offer——知识点储备-常用算法
剑指Offer——知识点储备-常用算法
快速排序
- 注:若排序是有序的,采用快排,则退化为冒泡排序。
解决这个问题,采用两个选取基准的方法
(1)随机选取基数(在这个区间内随机取一个数)
出现的恶劣情况是整个数组全相等,还是退化为冒泡排序
(2)三数取中法
把待排序列分成等长的子序列,最佳的是取中间数为基准
举例:待排序序列为:8 1 4 9 6 3 5 2 7 0
左边为:8,右边为0,中间为6.
我们这里取三个数排序后,中间那个数作为枢轴,则枢轴为6
四种优化方式:
优化方式1:插排
当待排序序列的长度分割到一定大小后(如子序列长度小于10),使用插入排序
优化方式2:聚集相等元素
优化方式3:采用尾递归
优化方式4:采用并行或多线程处理子序列
堆排序
全排列
/**
* 字符串的排列:(考察的知识点就是全排列)
* 输入字符: a b c
* 输出字符:abc ,acb,bac,bca,cab,cba
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String str=sc.next();
ArrayList<String> re=Permutation(str);
for(String s:re){
System.out.println(s);
}
}
}
public static ArrayList<String> Permutation(String str) {
ArrayList<String> re=new ArrayList<String>();
if(str==null||str.length()==0){
return re;
}
HashSet<String> set=new HashSet<String>();
fun(set,str.toCharArray(),0);
re.addAll(set);//将出现的字符串保存在list集合中
Collections.sort(re);
return re;
}
static void fun(HashSet<String> re,char[] str, int k){
if(k==str.length){
re.add(new String(str));
return;
}
for(int i=k;i<str.length;i++){//在for循环中,第一次初始化,然后判断,执行for循环体。执行完后i+1,在判断(初始化只执行一次)
swap(str,i,k);
fun(re,str,k+1);
swap(str,i,k);//防止元素的重复,进行复原
}
}
//将数组中的两个数进行交换
static void swap(char[] str,int i,int j){
if(i!=j){//相同就不用交换了
char t=str[i];
str[i]=str[j];
str[j]=t;
}
}
}
二进制数中1的个数(用与运算)
static int NumberOf3(int n) {
int count=0;
while(n!=0){//整数不为0,必有1
++count;
n=n&(n-1);
}
return count;
}
反转二叉树(就是二叉树的镜像)
public void Mirror(TreeNode root) {
if(root==null) {//为空结点
return;
}
if(root.left==null&&root.right==null){//表明该结点是叶子节点或只是根为的节点
return;
}
//交换当前节点的左右子树
TreeNode temp;
temp=root.left;
root.left=root.right;
root.right=temp;
if(root.left!=null){
Mirror(root.left);
}
if(root.right!=null){
Mirror(root.right);
}
}
通过前序、中序,重建二叉树
/**
* 解题的步骤:
* 1:递归的结束条件,只有到叶子节点,递归才结束(preStart==preEnd&&inStart==inEnd)
* 2:在中序中找到根,通过根算出左子树的长度,右子树的长度(左右子树各有多少个节点)
* 3:通过左子树的长度,算出前序左子树的起始节点(preStart+1,preStart+leftTree),中序左子树的起始节点(inStart,root-1),递归前提条件是leftLength>0(若为0,那就是叶子节点了)
* 4:同上算出右子树的递归
*/
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null||in==null){//只要一个为空,另一个必为
return null;
}
TreeNode root=binaryTree(pre,in,0,pre.length-1,0,in.length-1);
return root;
}
public TreeNode binaryTree(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
//构造一个结点
TreeNode node=new TreeNode(pre[preStart]);
node.left=null;
node.right=null;
//现在要想想递归的结束条件是什么,preStart=preEnd和inStart=inEnd,表明这是一个叶子节点
if(preStart==preEnd&&inStart==inEnd){
return node;
}
//现在要找出根节点
int root=0;
//肯定在in数组中找了
for(int i=inStart;i<in.length;i++){
if(pre[preStart]==in[i]){
root=i;
break;
}
}
//找到根节点,就得算出左右子树的长度(肯定是通过in数组)
int leftTree=root-inStart;//要去掉根节点即第一个节点
int rightTree=inEnd-root;
if(leftTree>0){
node.left=binaryTree(pre,in,preStart+1,preStart+leftTree,inStart,root-1);
}
if(rightTree>0){
node.right=binaryTree(pre, in, preStart+leftTree+1, preEnd, root+1, inEnd);
}
return node;
}
}
动态规划
动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解决由上一次子问题的解推出。
贪心算法:
每次选最大的,然后选择第二大的,在选第三大的,……,直到满足条件后结束或到最后也不能满足条件结束。
剑指Offer——知识点储备-常用算法的更多相关文章
- 剑指Offer——知识点储备-JVM基础
剑指Offer--知识点储备-JVM基础 1.java内存与内存溢出 1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页) (1)程序计数器(线程私有) 当前线程执行字节码的信号指示器 ...
- 剑指Offer——知识点储备-Java基础
剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...
- 剑指Offer——知识点储备--Linux基本命令+Makefile
剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...
- 剑指Offer——知识点储备-操作系统基础
剑指Offer--知识点储备-操作系统基础 操作系统 操作系统什么情况下会出现死锁? 产生死锁的必要条件 (1)互斥条件:即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有, ...
- 剑指Offer——知识点储备-数据库基础
剑指Offer--知识点储备-数据库基础 数据库 事务 事务的四个特性(ACID): 原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Dura ...
- 剑指Offer——知识点储备-J2EE基础
剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ...
- 剑指Offer——知识点储备-设计模式
剑指Offer--知识点储备-设计模式 设计模式 设计模式的六大原则 (1)单一职责原则(有且仅有一个原因引起类的变化): (2)里氏替换(任何父类出现的地方子类都可以替换): (3)依赖倒置(依赖抽 ...
- 剑指Offer——知识点储备-网络基础
剑指Offer--知识点储备-网络基础 计算机网络 http和https的区别 (1)http是http协议运行在tcp之上,所传输的内容都是明文,客户端和服务器端都无法验证对方的身份. (2)htt ...
- 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制
剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...
随机推荐
- Dev GridControl GridView常用属性
1.隐藏最上面的GroupPanel: gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值: sValue=Table.Rows[g ...
- springboot测试、打包、部署
本文使用<springboot集成mybatis(一)>项目,依次介绍springboot测试.打包.部署. 大多数朋友是做后端的,也就是为其他系统或者前端UI提供Rest API服务. ...
- 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)
题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...
- 前端之旅HTML与CSS篇之block与inline的区别
display:block;和display:inline;的区别block元素特点: 1)处于常规流中时,如果width没有设置,会自动填充满父容器 2)可以应用margin/padding 3)在 ...
- laravel整合JWT遇到的问题及解决方案
1.在执行 php artisan jwt:secret 生成密钥的时候,报错Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() do ...
- [LeetCode] Maximum Sum of 3 Non-Overlapping Subarrays 三个非重叠子数组的最大和
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum. E ...
- Java中数据表的建立
class Emp{ private int empno;//职工编号 private String ename;//姓名 private String job;//职位 private double ...
- Spring Cloud Eureka 自我保护机制
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果 ...
- [ Java学习基础 ] String、StringBuffer、StringBuilder比较学习
首先讲获得字符串对象的方式有两种,一种是直接使用字符串常量,一种是使用new关键字创建,但它们之间是有一些区别,如下运行实例: String s1 = new String("Hello&q ...
- [HNOI2010]MATRIX 矩阵
Description Input 第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数 ...