排序 快速排序 用于求解 Kth Element 问题,也就是第 K 个元素的问题. 可以使用快速排序的 partition() 进行实现.需要先打乱数组,否则最坏情况下时间复杂度为 O(N2). 堆排序 用于求解 TopK Elements 问题,也就是 K 个最小元素的问题.可以维护一个大小为 K 的最小堆,最小堆中的元素就是最小元素.最小堆需要使用大顶堆来实现,大顶堆表示堆顶元素是堆中最大元素.这是因为我们要得到 k 个最小的元素,因此当遍历到一个新的元素时,需要知道这个新元素是否比堆中最…
1. 把数组中的 0 移到末尾 283. Move Zeroes (Easy) Leetcode / 力扣 class Solution { public void moveZeroes(int[] nums) { int id=0; for(int num:nums){ if(num!=0)nums[id++]=num; } while(id<nums.length){ nums[id++]=0; } } } 跨计算节点 2. 改变矩阵维度 566. Reshape the Matrix (E…
BFS 广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点.需要注意的是,遍历过的节点不能再次被遍历. 第一层: 0 -> {6,2,1,5} 第二层: 6 -> {4} 2 -> {} 1 -> {} 5 -> {3} 第三层: 4 -> {} 3 -> {} 每一层遍历的节点都与根节点距离相同.设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di &l…
递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算. 斐波那契数列 1. 爬楼梯 70. Climbing Stairs (Easy) Leetcode / 力扣 题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法. 题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法. 定义一个数组 dp 存储上楼梯的方法数(为了方便讨论,数组下标从 1 开始),dp[i] 表示走到第 i 个楼梯的方法数目…
归并排序就是一个用分治法的经典例子,这里我用它来举例描述一下上面的步骤: 1.归并排序首先把原问题拆分成2个规模更小的子问题. 2.递归地求解子问题,当子问题规模足够小时,可以一下子解决它.在这个例子中就是,当数组中的元素只有1个时,自然就有序了. 3.最后,把子问题的解(已排好序的子数组)合并成原问题的解. 当待排序的序列长度为1时,递归"开始回升",在这种情况下不要做任何工作,因为长度为1的每个序列都已排好序.归并排序算法的关键操作是"合并"步骤中两个已排序序列…
二分查找实现 非常详细的解释,简单但是细节很重要 https://www.cnblogs.com/kyoner/p/11080078.html 正常实现 Input : [1,2,3,4,5] key : 3 return the index : 2 public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l <= h) { int m = l + (h - l) / 2; if…
1. 分配饼干 455. 分发饼干 题目描述:每个孩子都有一个满足度 grid,每个饼干都有一个大小 size,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足.求解最多可以获得满足的孩子数量. class Solution { public int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort(s); int i=0,j=0; while(i<g.length && j<s.l…
算法思想 双指针 167. 两数之和 II - 输入有序数组 双指针的典型用法 如果两个指针指向元素的和 sum == target,那么得到要求的结果: 如果 sum > target,移动较大的元素,使 sum 变小一些: 如果 sum < target,移动较小的元素,使 sum 变大一些. 数组中的元素最多遍历一次,时间复杂度为 O(N).只使用了两个额外变量,空间复杂度为 O(1). class Solution { public int[] twoSum(int[] numbers…
https://www.cnblogs.com/findbetterme/p/10787118.html 看这个就完事了 1. 统计两个数的二进制表示有多少位不同 461. Hamming Distance (Easy) Leetcode / 力扣 Input: x = 1, y = 4 Output: 2 Explanation: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ The above arrows point to positions where the correspo…
Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中.如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在.例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1). Java 中的 HashMap 主要用于映射关系,从而把两个元素联系起来.HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数.和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计.在对一个内…
1. 用栈实现队列 232. Implement Queue using Stacks (Easy) Leetcode / 力扣 class MyQueue { Stack<Integer> stack1=new Stack<>(); Stack<Integer> stack2=new Stack<>(); /** Initialize your data structure here. */ public MyQueue() { } /** Push el…
递归 一棵树要么是空树,要么有两个指针,每个指针指向一棵树.树是一种递归结构,很多树的问题可以使用递归来处理. 1. 树的高度 104. Maximum Depth of Binary Tree (Easy) Leetcode / 力扣 class Solution { public int maxDepth(TreeNode root) { if(root==null)return 0; return Math.max(maxDepth(root.left),maxDepth(root.rig…
204. 计数质数 难度简单523 统计所有小于非负整数 n 的质数的数量. class Solution { public int countPrimes(int n) { boolean[] isPrim = new boolean[n]; Arrays.fill(isPrim, true); // 从 2 开始枚举到 sqrt(n). for (int i = 2; i * i < n; i++) { // 如果当前是素数 if (isPrim[i]) { // 就把从 i*i 开始,i…
4. 两个字符串包含的字符是否完全相同 242. Valid Anagram (Easy) Leetcode / 力扣 可以用 HashMap 来映射字符与出现次数,然后比较两个字符串出现的字符数量是否相同. 由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,不再使用 HashMap. class Solution { public boolean isAnagram(String s, String t) { int[] hashchar…
1.发现两个链表的交点 160.两个链表的交集(容易) Leetcode /力扣 public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA=headA; ListNode curB=headB; while(curA!=curB){ if(curA==null){ curA=headB; }else{ curA=curA.next; } i…
搞了半天八数码弄不出来就只好来打题解  这道题是在搜索a碰到的(链接: http://pan.baidu.com/s/1jG9rQsQ ) 感觉题目最大亮点就是这英文简写"ni", 真是令人感慨出题老师的才华啊  好了,废话不多说  题目内容如下(闲烦请无视之,下下方有简单的介绍): [问题描述] 贝 西(Bessie)在卡摩洛遇到了棘手的情况:她必须穿越由Ni骑士把守的森林. 骑士答应Bessie只要 Bessie 能给他们带来一丛灌木就能安全穿越森林.时间宝贵,Bessie 必须尽…
试题 算法训练 数组逆序排列 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存放,并打印出来.要求:(1)只能定义一个数组:(2)在交换两个数组元素的值时,必须使用单独定义的一个函数swap.例如:假设用户输入了一组数据:7 19 -5 6 2 0,那么程序将会把前五个有效数据保存在一个数组中,即7 19 -5 6 2,然后把这个数组中的…
前段时间在看一本01年出的旧书<effective Tcp/Ip programming>,这个算法专题中断了几天,现在继续写下去. Introduction 对于单向链表(singly linked list),每个节点有⼀个next指针指向后一个节点,还有一个成员变量用以储存数值:对于双向链表(Doubly LinkedList),还有一个prev指针指向前一个节点.与数组类似,搜索链表需要O(n)的时间复杂度,但是链表不能通过常数时间读取第k个数据.链表的优势在于能够以较⾼的效率在任意位…
python数组和矩阵使用总结 1.数组和矩阵常见用法 Python使用NumPy包完成了对N-维数组的快速便捷操作.使用这个包,需要导入numpy. SciPy包以NumPy包为基础,大大的扩展了numpy的能力.因此只要导入了scipy,不必在单独导入numpy了!为了使用的方便,scipy包在最外层名字空间中包括了所有的numpy内容. 本文还是区分numpy中实现的和scipy中实现的. 以下默认已经:import numpy as np 以及 impor scipy as sp num…
****************************************************************************************** 动态规划 专题训练 ******************************************************************************************** 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见的. 1.递推: 递推一…
目录 1.简单的a+b 2.第一个HelloWorld程序! 3.三个数最大值 4.密码破译 5.母牛的故事 6.7.8.9.10 @(这里写自定义目录标题) 算法题训练网站:http://www.dotcpp.com 1.简单的a+b (1)题目地址:https://www.dotcpp.com/oj/problem1000.html (2)算法解析: 首先要能够接收到横向用空格分开的数据,并知道当运行的时候,在什么地方可以停止. (3)语法解析:   用java语法的时候scanner.ne…
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间距离值.时间复杂度 \(O(V^3 )\). int n, m, f[N][N]; memset(f, 0x3f, sizeof(f)); for (int i=1, a, b, w; i<=m; i++) { scanf("%d%d%d", &a, &b, &…
打算专题训练下DP,做一道帖一道吧~~现在的代码风格完全变了~~大概是懒了.所以.将就着看吧~哈哈 Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually gets caught in the end, often because they become too greedy. He has decided to work in t…
Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30069   Accepted: 12553 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "…
数据结构课本上给了这么一段算法求nextval9[]数组 int get_nextval(SString T,int &nextval[ ]) { //求模式串T的next函数修正值并存入数组nextval. i=; nextval[]=; j=; ] { ||T[i]==T[j]) { ++i; ++j; if (T[i]!=T[j]) nextval[i]=j; else nextval[i]=nextval[j]; } else j=nextval[j]; } }//get_nextval…
原文:https://blog.csdn.net/yearn520/article/details/6729426 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容. 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失…
20170529-2枚举算法专题练习 题解: http://www.cnblogs.com/ljc20020730/p/6918360.html 青岛二中日期 序号 题目名称 输入文件名 输出文件名 时限 内存 算法 难度 分类 081113 1 最大矩形 rectangle.in rectangle.out 1s 256MB 枚举 1 02枚举 081031 2 回文 palin.in palin.out 1s 256MB 枚举.优化 1 02枚举 081008 3 问题的设置 problem…
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值.   名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家.       所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的…
总结: 首先 import numpy as np A = np.random.randint(1,100,size = (4,5)) >>A>>array([[56, 96, 27, 38, 33],       [86, 64, 52, 21, 66],       [97, 84, 94, 20, 82],       [65, 17, 77,  9, 17]]) 通常情况下,列表.元组.字典采用len(A),而数组.矩阵采用np.size(A)或A.size.…
Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2398    Accepted Submission(s): 1187 Problem Description For each prefix of a given string S with N characters (each character has an ASCII…