当前位置: 首页 > news >正文

基础算法整理

二分查找:

public class BinarySearch {
    //1、普通的二分查找
    public static int binarySearch(int[] arr,int target){
        if(arr.length==0) return -1;
        int left=0,right=arr.length-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(arr[mid]==target){
                return mid;
            }else if(arr[mid]<target){
                left=mid+1;
            }else{
                right=mid-1;
            }
        }
        return -1;
    }
    //2、寻找左边界
    public static int left_bound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] == target) {
                // 别返回,锁定左侧边界
                right = mid - 1;
            }
        }
        // 最后要检查 left 越界的情况
        if (left >= nums.length || nums[left] != target)
            return -1;
        return left;
    }
    //3、寻找右边界
    public static int right_bound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] == target) {
                // 别返回,锁定右侧边界
                left = mid + 1;
            }
        }
        // 最后要检查 right 越界的情况
        if (right < 0 || nums[right] != target)
            return -1;
        return right;
    }
}

快排:

public class QuickSort {
    public static void quickSort(int[] array,int low,int high){
        if(low<high){
            //寻找基准数据的正确索引
            int index=getIndex(array,low,high);
            //分治
            quickSort(array,low,index-1);
            quickSort(array,index+1,high);
        }
    }
    public static int getIndex(int[] array,int low,int high){
        //基准数据
        int tmp=array[low];
        while(low<high){
            //当队尾的元素大于等于基准数据时,向前挪动high指针
            while(low<high&&array[high]>=tmp){
                high--;
            }
            // 如果队尾元素小于tmp了,需要将其赋值给low
            array[low]=array[high];
            // 当队首元素小于等于tmp时,向前挪动low指针
            while(low<high&&array[low]<=tmp){
                low++;
            }
            // 当队首元素大于tmp时,需要将其赋值给high
            array[high]=array[low];
        }
        // 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置
        array[low]=tmp;
        return low;
    }
}

归并排序:

public class MergeSort {
    public static int[] mergeSort(int[] array){
        if(array.length<2) return array;
        int mid=array.length/2;
        int[] left= Arrays.copyOfRange(array,0,mid);
        int[] right=Arrays.copyOfRange(array,mid,array.length);
        return merge(mergeSort(left),mergeSort(right));
    }
    public static int[] merge(int[] left,int[] right){
        int[] result=new int[left.length+right.length];
        for(int index=0,i=0,j=0;index<result.length;index++){
            if(i>=left.length)
                result[index]=right[j++];
            else if(j>=right.length)
                result[index]=left[i++];
            else if(left[i]>right[j])
                result[index]=right[j++];
            else
                result[index]=left[i++];
        }
        return result;
    }
}

堆排序:

public class HeapSort {
    public static int len;
    public static int[] heapSort(int[] array){
        len=array.length;
        if(len<1) return array;
        //构建最大堆
        buildMaxHeap(array);
        //依次将最大堆的元素移至数组尾部,并维护最大堆
        while(len>0){
            int temp=array[len-1];
            array[len-1]=array[0];
            array[0]=temp;
            len--;
            adjustHeap(array,0);
        }
        return array;
    }
    public static void buildMaxHeap(int[] array){
        len= array.length;
        //从最后一个非叶子节点开始向上构造最大堆
        for (int i = (len/2- 1); i >= 0; i--) {
            adjustHeap(array, i);
        }
    }
    public static void adjustHeap(int[] array, int i) {
        //指向最大值的指针
        int maxIndex = i;
        //i的左子树和右子树分别2i+1和2(i+1)
        int left=i * 2 + 1;
        int right=i * 2 + 2;
        //如果有左子树,且左子树大于父节点,则将最大指针指向左子树
        if (left < len && array[left] > array[maxIndex])
            maxIndex = left;
        //如果有右子树,且右子树大于父节点,则将最大指针指向右子树
        if (right < len && array[right] > array[maxIndex])
            maxIndex = right;
        //如果父节点不是最大值,则将父节点与最大值交换,并且递归调整与父节点交换的位置。
        if (maxIndex != i) {
            int temp=array[maxIndex];
            array[maxIndex]=array[i];
            array[i]=temp;
            adjustHeap(array, maxIndex);
        }
    }
}

树的三种遍历(递归和迭代):

二叉树的前序遍历:根 左 右
递归

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        preorder(root,res);
        return res;
    }
    public void preorder(TreeNode root,List<Integer>list){
        if(root==null) return;
        list.add(root.val);
        preorder(root.left,list);
        preorder(root.right,list);
    }
}

迭代:队列存取右子树

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        Deque<TreeNode>stack=new LinkedList<>();
        TreeNode temp=root;
        while(temp!=null||!stack.isEmpty()){
            while(temp!=null){
                stack.addFirst(temp.right);
                res.add(temp.val);
                temp=temp.left;
            }
            temp=stack.removeFirst();
        }
        return res;
    }
}

二叉树的中序遍历:左 根 右
递归

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        preorder(root,res);
        return res;
    }
    public void preorder(TreeNode root,List<Integer>list){
        if(root==null) return;
        preorder(root.left,list);
        list.add(root.val);
        preorder(root.right,list);
    }
}

迭代:队列存取根

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        Deque<TreeNode>queue=new LinkedList<>();
        TreeNode temp=root;
        while(temp!=null||!queue.isEmpty()){
            while(temp!=null){
                queue.addFirst(temp);
                temp=temp.left;
            }
            temp=queue.removeFirst();
            res.add(temp.val);
            temp=temp.right;
        }
        return res;
    }
}

二叉树的后序遍历:左 右 根
递归

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        preorder(root,res);
        return res;
    }
    public void preorder(TreeNode root,List<Integer>list){
        if(root==null) return;
        preorder(root.left,list);
        preorder(root.right,list);
        list.add(root.val);
    }
}

迭代,后续遍历结果的逆序为根 右 左,参考前序遍历根 左 右

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        Deque<TreeNode>queue=new LinkedList<>();
        TreeNode temp=root;
        while(temp!=null||!queue.isEmpty()){
            while(temp!=null){
                queue.addFirst(temp.left);
                res.add(temp.val);
                temp=temp.right;
            }
            temp=queue.removeFirst();
        }
        Collections.reverse(res);
        return res;
    }
}

相关文章:

  • C++20 三路比较运算符 `<=>` 与 `operator==() = default` 的深度剖析及实际应用
  • VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件
  • Linux进程控制
  • leetcode 73. 矩阵置零
  • 鸿蒙新版开发工具DevEco Studio不能新建模拟的解决方法
  • 两台互通的服务器使用Docker部署一主两从MySQL8.0.35
  • 【Qt】为程序增加闪退crash报告日志
  • Nginx面试宝典【刷题系列】
  • 广州无人机考试培训收费标准(附报名流程)
  • 【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)
  • python 剪切音频
  • [特殊字符]️ ‌Selenium元素存在性判断的5种方法‌
  • 归纳总结一下Tensorflow、PaddlePaddle、Pytorch构建神经网络基本流程,以及使用NCNN推理的流程
  • 快速上手 Uniapp:从入门到精通的捷径
  • css 设置svg文字的对齐方式。右对齐
  • 五、Redis哨兵监控
  • Halcon 颜色分割算子、RGB和HSV之间的转换
  • 基于STM32的智能垃圾分类与回收系统
  • Go红队开发—并发编程
  • 数据结构:二叉树的数组结构以及堆的实现详解
  • 庆祝上海总工会成立100周年暨市模范集体劳动模范和先进工作者表彰大会举行,陈吉宁寄予这些期待
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • “降息潮”延续!存款利率全面迈向“1时代”
  • 全国人大常委会启动食品安全法执法检查
  • “仓促、有限”,美英公布贸易协议框架,两国分别获得了什么?
  • 七大交响乐团“神仙斗法”,时代交响在上海奏出时代新声