
算法
王祉凯的博客
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
快速排序理解
思路 从数组中取一个数,称之为基数。 遍历数组,将比基数大的放在它右边,比基数小的放在它左边。 遍历之后,原数组被分为左右两个区域。 将左右两个区域视为两个数组,重复前面两个步骤,知道排序完成, 快速递归框架 public static void quickSort(int[] arr) { quickSort(arr, 0, arr.length - 1); } public static void quickSort(int[] arr, int start, int end) { //原创 2022-03-13 16:06:35 · 378 阅读 · 1 评论 -
插入排序哈
思想: 和打扑克的思想一样,我们抓拍的同时去给牌排序,每一次摸一张牌,就将它插入手上已有的牌中最合适的位置,逐步完成整改排序。 插入排序的两种写法 交换法:在新数字插入过程中,不断与前面的数字交换,知道找到自己合适的位置。 移动法,在新数字插入过程中,前面的数字不断往后挪出位置,当新数字插入找到自己的位置之后,插入一次即可。 交换法插入排序 直接上代码 class Solution { public int[] sortArray(int[] nums) { insertSort原创 2022-03-12 09:33:49 · 1128 阅读 · 0 评论 -
旋转矩阵啊
题目描述: 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 要求:不使用额外的空间,在原数组上修改 示例: 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ] -------------------分割--------------------- 给定 matrix = [ [ 5, 1,原创 2022-03-10 09:27:45 · 278 阅读 · 0 评论 -
数组找峰值(先增后减)
题目解释分析 解释: 现在有一个数组,前边递增,后边递减。寻找最大值。 **分析:**说到底,就是找一个数tar,找这个数的特点是,tar - 1 < tar >tar +1。所以,利用这个条件,就不难想到以下思路。 一:利用 tar > tar+1。 思路: for循环遍历数组,遇到tar > tar+1 时。便找到了最大值。 public int findPeakElement(int[] nums) { for(int i = 0; i<nums.l原创 2022-03-04 17:24:07 · 1101 阅读 · 0 评论 -
选择排序极其优化
选择排序 思想: 双重for循环遍历数组,在每一轮比较中,找出最小元素的下标,将最小元素换到“首位”。 public static void selectionSort(int[] arr) { int minIndex; for (int i = 0; i < arr.length - 1; i++) { minIndex = i; for (int j = i + 1; j < arr.length; j++) { if原创 2022-02-19 20:17:00 · 464 阅读 · 0 评论 -
冒泡排序以及优化思路
冒泡排序以及优化 一、思路 正常思路: 一边比较一边向后两两交换,将最大值/最小值冒泡到最后一位。 优化一: 使用一个变量记录当前轮是否发生交换,如果未发生交换,则表示已经排好序。 优化二: 除了比较使用变量记录当前轮次是否发生交换外,再使用一个变量记录上次发生交换的位置,下一轮排序时到达上次交换的位置就停止比较。 正常思路代码 public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i原创 2022-02-12 10:38:58 · 2122 阅读 · 0 评论 -
前 n 个数字二进制中 1 的个数
题目说明 给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。 示例说明 输入: n = 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 思路梳理 从0向后面推 十进制数 —— 2 进制数 —— 1的个数 0 —— 0 —— 0 1 —— 0 —— 1 2 —— 10 —— 1 (2是1的二倍,相当于1左移1位,所以1的个数与1相同) 3 —— 11 —— 2 (不存在 3/原创 2022-01-16 19:44:23 · 399 阅读 · 0 评论 -
树的遍历—数据结构
本周做了一部分关于树的算法,在这里也总结一下遍历数的四种方法。 1.先序遍历 (先根,再左,后右) 2.中序遍历 (先左,再根,后右) 3.后序遍历 (先左,再右,后根) 4.层序遍历 (从每层的左边开始遍历,我自己没有用过) 一、来一道题。 1.先序结果:FCADBEHGM 2.中序结果:ACBDFHEMG 3.后序结果:ABDCHMGEF 4.层序结果:FCEADHGBM 二、递归实现 public static void Tree(TreeNode root){ //先写出递归的结束条件 if(ro原创 2021-11-21 17:25:15 · 499 阅读 · 0 评论 -
移动零——双指针
今天做了一道算法题,刚开始没有思路,直到看到一个点赞超多的评论,看了一遍,逻辑很简单,第一次没看懂,然后去仔细推了一下,结果惊艳到我了!! 题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 分析 这个题目是放在双指针模块需要做的,双指针?那我把两个指针放在哪呢?前前,后后,前后?没有思路,不知道用双指原创 2021-10-18 21:09:28 · 212 阅读 · 0 评论 -
进击吧!阶乘 —— Java—BigInteger
问题描述 输入描述 多组测试数据,每个测量数据输入一个整数N (0≤N≤10000) (最后输给了这个N) 输出描述 每组用一行输出N的阶乘 刚开始的思路 定一个求阶乘的方法。然后while(sc.hasNext())里边调用,不就求出来每一个数的阶乘了。可莉平A,简单搞定。说干就干,代码如下: 定义一个计算一个数的阶乘的方法 public static int countJ(int n) { if(n==0){ return 0; }原创 2021-08-19 11:09:08 · 402 阅读 · 0 评论