
算法
ZeroClian
resource都在 心迹阁
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指面试题13——机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:m = 3,原创 2020-09-13 16:32:39 · 80 阅读 · 0 评论 -
回溯算法入门级详解 + 练习
回溯算法入门级详解 + 练习原创 2020-09-11 11:06:23 · 190 阅读 · 0 评论 -
39.组合总和——回溯+剪枝
39.组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[ [7], [2,2,3]]示例 2:输入:candidates = [2,3,5], t原创 2020-09-10 17:53:15 · 113 阅读 · 0 评论 -
动态规划相关题目——Leetcode(持续更新)
1.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。 public i原创 2020-07-28 19:21:52 · 229 阅读 · 0 评论 -
递归相关题目——leetcode
1.求幂次方实现 pow(x, n) ,即计算 x 的 n 次幂函数思路:递归,折半求幂次方代码:public double myPow(double x, int n) { if(n == 0) return 1; if(n == 1) return x; if(n == -1) return 1/x; double half = myPow(x,n/2); double mod = myPow(x,n%2);原创 2020-07-28 19:15:45 · 210 阅读 · 0 评论 -
前缀和算法应用——周赛题
5457. 和为奇数的子数组数目给你一个整数数组 arr 。请你返回和为 奇数 的子数组数目。由于答案可能会很大,请你将结果对 10^9 + 7 取余后返回。示例 1: 输入:arr = [1,3,5] 输出:4 解释:所有的子数组为 [[1],[1,3],[1,3,5],[3],[3,5],[5]] 。 所有子数组的和为 [1,4,9,3,8,5]. 奇数和包括 [1,9,3,5] ,所以答案为 4 。示例 2 : 输入:arr = [2,4,6] 输出:0 解释:所有子数组为原创 2020-07-26 13:35:52 · 265 阅读 · 0 评论 -
桶思想相关的Leetcode题解
1512.好数对的数目给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。示例 1:输入:nums = [1,2,3,1,1,3]输出:4解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始提示:1 <= nums.length <= 1001 <= nums[i] <= 100public原创 2020-07-26 01:38:06 · 145 阅读 · 0 评论 -
如何判断二叉树是平衡、搜索、完全?
1.判断是否是平衡二叉树?思路:实现一个递归函数判断每一个节点的左右子树的高度差是否大于1,若大于1,直接将状态值设置为false,否则将当前子树的长度设置为较大的子树高度,并返回。代码实现 public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public s原创 2020-07-25 19:07:18 · 267 阅读 · 0 评论 -
如何用非递归方式实现二叉树的先序、中序、后序遍历?
如何用非递归方式实现二叉树的先序、中序、后序遍历?先上递归的实现版本:public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public static void preOrderRecur(Node head) { if (head == null) { re原创 2020-07-24 18:34:07 · 948 阅读 · 0 评论 -
如何快速验证算法正确性?——对数器
对数器一个产生随机样本的产生器准备一个绝对正确的方法(系统的,复杂度高的)大样本测试算法将出错样例打印出来,修改算法以数组排序为例: // 绝对正确的数组排序 public static void comparator(int[] arr) { Arrays.sort(arr); } // 产生随机样本数组 public static int[] generateRandomArray(int maxSize, int maxValue) { int[] a原创 2020-07-22 22:12:40 · 1494 阅读 · 0 评论 -
队列结构与栈结构之间的相互实现
如何仅用队列结构实现栈结构?思路:用两个队列,一个用于存放数据(queue),当要取出数据时,把除了queue队列头以为的数据依次存到的另一个队列(help)中,再把队列头取出,然后改变queue和help的指向,数据仅能从queue队列存入。具体实现: public static class TwoQueuesStack { private Queue<Integer> queue; private Queue<Integer> help; public Tw原创 2020-07-22 21:44:43 · 122 阅读 · 0 评论 -
栈相关的经典面试题及解法
题目一:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。【要求】1.pop、push、getMin操作的时间复杂度都是O(1)。2.设计的栈类型可以使用现成的栈结构。思路:代码实现: public static class MyStack1 { private Stack<Integer> stackData; private Stack<Integer> stackMin; public MyStack1() { t原创 2020-07-22 18:14:41 · 276 阅读 · 0 评论 -
用数组结构实现大小固定的队列和栈
用数组结构实现大小固定的队列和栈实现栈:代码实现: public static class ArrayStack { private Integer[] arr; private Integer size; public ArrayStack(int initSize) { if (initSize < 0) { throw new IllegalArgumentException("The init size is less than 0"); } a原创 2020-07-22 17:48:15 · 140 阅读 · 0 评论 -
利用桶的思想求一个数组经过排序后相邻两数的最大差值
桶排序按照数据状况,设计一个容器,把对应的数据放到对应的桶里,最后再把每个桶的内容取出来。(存在局限性,不基于比较),是一个稳定的排序。时间复杂度O(N),额外空间复杂度O(N)问题:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。桶思想解决问题思路:代码实现: public static int maxGap(int[] nums) { if (nums == null || nums.length < 2) { r原创 2020-07-22 01:17:10 · 184 阅读 · 0 评论 -
堆结构及堆排序详解
堆排序完全二叉树:大根堆:在完全二叉树中,任何一颗子树的最大值都是子树的头部小根堆:在完全二叉树中,任何一颗子树的最小值都是子树的头部如何将数组转换成为一个大根堆?代码实现: public static void heapInsert(int[] arr, int index) { while (arr[index] > arr[(index - 1) / 2]) { swap(arr, index, (index - 1) / 2); index = (index -原创 2020-07-21 18:53:47 · 234 阅读 · 0 评论 -
荷兰国旗算法及随机快排原理详解
荷兰国旗问题给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)解决思路:遍历,如果index的值小于num,与less区域的下一个值交换并扩大less区域,index++;如果大于num,则more区域的前一个值交换,并扩大more区域,index不变,继续判断;如果相等,则index++。代码实现:public static int[] partition(int原创 2020-07-21 14:22:33 · 595 阅读 · 0 评论 -
二分查找常用模板及例题
二分查找模板一int binarySearch(int[] nums, int target){ if(nums == null || nums.length == 0) return -1; int left = 0, right = nums.length - 1; while(left <= right){ // Prevent (left + right) overflow int mid = left + (right - left) / 2;原创 2020-07-06 22:11:43 · 211 阅读 · 0 评论 -
数组应用——二维数组转稀疏数组、循环队列
1.数组实现循环队列import java.util.Scanner;public class CircleArrayQueueDemo { public static void main(String[] args) { //测试循环队列 //创建一个队列 CircleArray queue = new CircleArray(4);...原创 2020-05-02 00:20:45 · 978 阅读 · 0 评论 -
3种基础排序算法O(N^2)——冒泡、插入、选择
排序常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。时间复杂度为一个算法流程中,常数操作数量的指标。常用O(big O)来表示。具体来说,在常数操作数量的表达式中只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分记为f(n),那么时间复杂度为O( f(n) )。评价一个算法流程的好换,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,...原创 2019-11-28 19:33:03 · 139 阅读 · 0 评论