剑指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——知识点储备-常用算法的更多相关文章

  1. 剑指Offer——知识点储备-JVM基础

    剑指Offer--知识点储备-JVM基础 1.java内存与内存溢出 1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页) (1)程序计数器(线程私有) 当前线程执行字节码的信号指示器 ...

  2. 剑指Offer——知识点储备-Java基础

    剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...

  3. 剑指Offer——知识点储备--Linux基本命令+Makefile

    剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...

  4. 剑指Offer——知识点储备-操作系统基础

    剑指Offer--知识点储备-操作系统基础 操作系统 操作系统什么情况下会出现死锁? 产生死锁的必要条件 (1)互斥条件:即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有, ...

  5. 剑指Offer——知识点储备-数据库基础

    剑指Offer--知识点储备-数据库基础 数据库 事务 事务的四个特性(ACID):   原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Dura ...

  6. 剑指Offer——知识点储备-J2EE基础

    剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ...

  7. 剑指Offer——知识点储备-设计模式

    剑指Offer--知识点储备-设计模式 设计模式 设计模式的六大原则 (1)单一职责原则(有且仅有一个原因引起类的变化): (2)里氏替换(任何父类出现的地方子类都可以替换): (3)依赖倒置(依赖抽 ...

  8. 剑指Offer——知识点储备-网络基础

    剑指Offer--知识点储备-网络基础 计算机网络 http和https的区别 (1)http是http协议运行在tcp之上,所传输的内容都是明文,客户端和服务器端都无法验证对方的身份. (2)htt ...

  9. 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制

    剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...

随机推荐

  1. oracle 11g rac R2 for linux change(public,vip)IP ,hostname (oracle 11g rac R2 修改公有,虚拟,私有IP,网卡)

    结构如下: 说明: 节点IP,主机名的修改步骤来自ORACLE support文档: 如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1) 实验环境情况如下: 实验 节点名称 数 ...

  2. python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法

    一.内置函数补充 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstan ...

  3. jQuery.noConflict() 函数详解

    jQuery.noConflict()函数用于让出jQuery库对变量$(和变量jQuery)的控制权. 一般情况下,在jQuery库中,变量$是变量jQuery的别名,它们之间是等价的,例如jQue ...

  4. JavaScript 字典(Dictionary)

    TypeScript方式实现源码 //  set(key,value):向字典中添加新元素. //  remove(key):通过使用键值来从字典中移除键值对应的数据值. //  has(key ...

  5. 浅谈轮播图(原生JavaScript实现)

    现在各种轮播图插件,玲琅满目,用起来也非常方便,通常只需要选择元素然后传入参数就可以了.但是,和授人以鱼不如授人以渔一样的道理,不管怎样最基本的轮播图原理还是应当掌握的.这样不仅有利于我们自己写出来满 ...

  6. 6.QT-简易计算器实现(详解)

    界面展示 1.用户界面类设计 需要使用QWidget组件作为顶层窗口,QLineEdit组件作为输入框,QPsuhButton作为按钮 1.1 在代码里处理按键消息时,需要处理下用户输入的格式(方便逻 ...

  7. [SDOI 2011]染色

    Description 题库链接 给定一棵有 \(n\) 个节点的无根树和 \(m\) 个操作,操作有 \(2\) 类: 将节点 \(a\) 到节点 \(b\) 路径上所有点都染成颜色 \(c\) : ...

  8. NOIP 2011 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  9. poj 1228 稳定凸包

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12337   Accepted: 3451 ...

  10. C# 枚举在项目中使用心得

    阅读目录 基本介绍 使用注意 使用方法 扩展用法     本文主要是我在项目中对C#枚举的使用心得,如有不足的地方欢迎您指出. 一.基本介绍  枚举是由一组特定常量构成的一组数据结构,是值类型的一种特 ...