
算法
CodeJames
重庆大学研究生毕业,从事IOT后台开发,同名G.Z.H
展开
-
程序员面试经典-20200221
20200221题目 :实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4思路 :双指针,fast指针与slow指针保存k个间隔。codepublic int kthToLast(ListNode head, int k){ ListNode...原创 2020-02-21 11:54:09 · 131 阅读 · 0 评论 -
程序员面试经典-20200220
20200220题目 :零矩阵,编写一种算法,若M*N矩阵中某个元素为0,则将其所在行与列清零。思路 :通过遍历矩阵,找到0的索引下标,多所在行,列清零。codepublic void setZeros(int[][] matrix){ HashSet<Integer> row_set = new HashSet<>(), col_set = new Has...原创 2020-02-20 10:34:34 · 161 阅读 · 0 评论 -
20200217
判定字符是否唯一题目 :实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = “leetcode”输出: false示例 2:输入: s = “abc”输出: true思路:字符全都不同,可以想到的是集合可以保证字符的唯一性。最后判断集合的字符串长度和给定的字符串长度是否相等。codepublic boolean isUnique(String a...原创 2020-02-17 10:23:51 · 319 阅读 · 1 评论 -
200216
判定字符是否唯一题目 :实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = “leetcode”输出: false示例 2:输入: s = “abc”输出: true思路:字符全都不同,可以想到的是集合可以保证字符的唯一性。最后判断集合的字符串长度和给定的字符串长度是否相等。codepublic boolean isUnique(String a...原创 2020-02-16 17:03:15 · 154 阅读 · 0 评论 -
数据结构-随看-栈-补
数据结构-随看-栈-补栈:先入后出, push pop。模板: Stack<Integer> s = new Stack<>(); s.push(); s.pop();最小栈设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。...原创 2020-02-14 11:16:51 · 119 阅读 · 0 评论 -
数据结构-随看-栈
数据结构-随看-栈栈:先入后出, push pop。模板: Stack<Integer> s = new Stack<>(); s.push(); s.pop();最小栈设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。t...原创 2020-02-13 12:02:17 · 138 阅读 · 0 评论 -
数据结构-随看-队列
数据结构-随看-队列队列可以使用动态数组和指向队列头部的索引:List data = new List<>();更有效的方法是使用循环队列。即使用固定大小的数组和两个指针来指示起始位置和结束位置。循环队列-实现class MyCircularQueue { private int[] data; private int head;...原创 2020-02-12 12:02:44 · 125 阅读 · 0 评论 -
搜索二维矩阵
搜索二维矩阵 ||题目 编写一个高效的算法来搜索m*n矩阵matrix中的一个目标值target,其中:每行的元素从左到右升序排列每列的元素从上到下升序排列示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26...原创 2020-02-11 10:57:30 · 614 阅读 · 0 评论 -
合并两个有序数组
合并两个有序数组给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3...原创 2020-02-11 10:56:37 · 165 阅读 · 0 评论 -
多数元素
多数元素题目 给定一个数组,找到其中的多数元素,多数元素是指在数组中出现⌊n/2⌋\lfloor n/2 \rfloor⌊n/2⌋ 次。方法一 :利用散列表,进行计数,即<数字,出现次数>, 最后遍历散列表,找到满足的数字。public int majorityElement(int[] nums){ double n = Math.ceil(nums.length / ...原创 2020-02-10 10:26:21 · 233 阅读 · 0 评论 -
只出现一次的数字
只出现一次的数字题目:给定了一个非空整数数组,除了某个元素只出现一次意外,其余每个元素均出现两次。找出那个只出现一次的元素。方法一 比较法:思路 :先对数组进行排序,然后对nums[i]和nums[i+1]进行比较,i+=2,继续下一组比较。codepublic static int singleNumber(int[] nums){ Arrays.sort(nums); ...原创 2020-02-10 10:25:15 · 147 阅读 · 1 评论 -
动态规划-三角形最小路径和
三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。思路 :先将每一行按照第一列对齐,采用自底向上的方式,定义一个*minlen[]*用于存储得到的结...原创 2020-02-09 11:10:15 · 473 阅读 · 1 评论 -
动态规划-不同的二叉搜索树
动态规划-不同的二叉搜索树题目 给定一个整数n,求以1…n为节点组成的二叉搜索树有多少种?输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2...原创 2020-02-08 13:10:25 · 169 阅读 · 0 评论 -
动态规划(不同的二叉搜索树)
动态规划(不同的二叉搜索树||)考虑 [] 的所有解null考虑 [ 1 ] 的所有解1考虑 [ 1 2 ] 的所有解 2 /1 1 \ 2考虑 [ 1 2 3 ] 的所有解 3 / 2 /1 2 / \ 1 3 3 / 1 \ 2 1 ...原创 2020-02-07 11:33:44 · 146 阅读 · 0 评论 -
动态规划(解码方法)
动态规划(解码方法)题目 :以11056为例,从后往前遍历。首先是6,很明显是1种6->F接着是56,很明显还是1种56->EF接着是056,结果为0接着是1056,结果为numDecodings(10 56) + numDecodings(1 056) = numDecodings(10 56)->JEF接着是11056,结果为numDecodings(1 105...原创 2020-02-06 11:18:56 · 373 阅读 · 0 评论 -
二叉搜索树(1038)
二叉搜索树(1038)二叉搜索树相比于其他数据结构的优势在于查找,插入的时间复杂度较低。为O(logn)。从二叉搜索树到跟大和树思路 通过遍历从最右节点开始计算,之后的每个节点都可以使用前一个节点的值 + 本身的值。代码 :class Solution{ int currVal = 0; public TreeNode bstToGst(TreeNode root){ ...原创 2020-02-05 11:03:24 · 109 阅读 · 0 评论 -
动态规划-2-1
最大子序和public int crossSum(int[] nums, int left, int righ, int p){ if(left == right) return nums[left]; int leftSubsum = Integer.MIN_VALUE; int currSum = 0; for(int i=p;i > le...原创 2020-02-01 08:54:35 · 162 阅读 · 0 评论 -
DFS
DFS求根到叶子节点之和思路:分治法,知道从根节点出发经过左子树的所有路径和从根节点出发经过右子树的所有路径和,把两者加起来即可。public int sumNumbers(TreeNode root){ if(root == null){ return 0; } return sumNumbersHelper(root,0);}private i...原创 2020-01-19 22:16:58 · 184 阅读 · 0 评论 -
解递归算法的运行时间的三种方法
1.代换法 运用代换法处理递归算出程序需要的运行时间,要发挥一个程序员的直觉,一个字:猜。2.递归数3.主定理原创 2018-05-18 10:10:04 · 2338 阅读 · 1 评论 -
插入排序(伪代码)
INSERTION_SORT(A)1.for j=2 to A.length2.key=A[j]3. i=j-1;4. while i>0 and A[i]>key5. A[i+1]=A[i]6. i=i-17. A[i+1]=key运行过程如下:...原创 2018-05-29 17:48:21 · 5920 阅读 · 4 评论 -
选择排序
CHOOSE_SORT(A)1.for i to A.length2. small=A[i]3. num=i;4. for j=i+1 to A.length5. if small>A[j]6. small=A[j]7. num=j8. temp=A[i]9. A[i]...原创 2018-05-29 18:04:06 · 222 阅读 · 0 评论 -
二分法查找
//A为数组,p为数组下限,r为数组上限,v为要查找的数组BINARY-SEARCH(A,p,r,v) if p<=r q=[(p+2)/2] if A[q]==v return q elif A[q]>v return BINARY-SEARCH(A,p,q-1,v) else return BINAR...原创 2018-05-30 10:44:12 · 241 阅读 · 0 评论 -
霍纳规则
int horner(int *a,int n,int x) { int ax=a[n]*x+a[n-1]; for(int i=n-2;i>=0;i--) { ax=ax...原创 2018-05-30 11:06:32 · 295 阅读 · 0 评论 -
表扩展
TABLE-INSERT(T,x)1 if T.size==02 allocate T.table with 1 slot3 T.size=14 if T.num==T.size5 allocate new-table with 2*T.size slots6 insert all items in T.table into new.table7 ...原创 2018-06-09 20:26:13 · 233 阅读 · 0 评论 -
算法导论6.5-3
HEAP-MINIMUM(A) 1 return A[1] HEAP-EXTRACR-MIN(A) 1 if heap-size[A] < 1 2 then error "heap underflow" 3 min =A[1] 4 A[1] = A[heap-size[A]] 5 heap-size[A] = heap-...原创 2018-07-25 17:02:54 · 254 阅读 · 0 评论 -
算法导论6.5-1
由HEAP-EXTRACT-MAX(A)1 if A.heap-size<12 error "heap underflow"3 max=A[1]4 A[1]=A[A.heap-size]5 A.heap-size=A.hep-size-16 MAX-HEAPIFY(A,1)7 return max1覆盖堆顶15,堆的大小减一,1和13交换,...原创 2018-07-25 17:28:30 · 292 阅读 · 0 评论 -
算法导论5.4-1
题目:假设我们将球投入b个箱子中,直到某个箱子中有两个球。每一次投掷都是独立的。请问投球次数的期望是多少?解原创 2018-07-28 17:37:30 · 589 阅读 · 0 评论 -
数组A的k排序
定义: 如果对所有的i=1,2,..,n-k有下式成立,我们就称一个包含n个元素的数组A为k排序的: 题目:编写程序,使能在O(nlgn/k)内对n个元素进行k排序:#include <iostream>#include &...原创 2018-08-15 16:02:02 · 990 阅读 · 1 评论 -
算法随笔
在找最小值的过程中会淘汰lgn个数,选择两个数进行比较,把较小的一个值与最小值进行比较,整个过程形成了一颗二叉树。 找最小值花费n-1次,选定一个最小值,与剩下的n-1个值进行比较。 由上可知,找第二个最小值需要n-2+lgn次比较。 线性时间的排序:1,计数排序;2,基数排序;3,桶排序; 比较次数就是树的高度。 期望为线性时间的选择排序,此算法和快速排序很相似,它只需处理划分后的一半...原创 2018-08-16 10:40:18 · 209 阅读 · 0 评论 -
怎样在线性时间进行选择的算法
#include <iostream>#include <time.h>#include "stdlib.h"using namespace std;//随机化分割int randomized_partition(int* a, int p, int r);int randomized_select(int* a, int p, int r, int i);...原创 2018-08-17 10:34:22 · 499 阅读 · 0 评论 -
巧记二叉数的左旋
一,以下的程序是算法导论中的源码,我刚开始看这个左旋的时候看了很久,很是不理解,它到底是怎样旋转的,看图容易理解想要记好程序我感到比较困难。书上有几句是关键点:左旋以x到y的链为轴,使y成为该孩子树新的根结点,x成为y的左孩子,y的左孩子成为x的右孩子;同理右旋以y到x的链为轴,使x为该孩子数的新结点,y成为x的右孩子,x的右孩子成为y的左孩子。左旋和右旋是以指针的形式进行的,具体操作请看到最后:...原创 2018-09-27 15:16:34 · 565 阅读 · 0 评论 -
需要了解几种排序的运行时间
1.快速排序:O(nlgn)2.堆并排序:O(nlgn)3.归并排序:O(nlgn)4.插入排序:O(n^2)原创 2018-05-18 10:16:20 · 521 阅读 · 0 评论