
算法
zhumingyuan111
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法:动态连通性问题
最近在《算法》书中看到动态连通问题,今天给出其实现的代码。接口package com.chapter1;public interface UnionFind { int getCount(); boolean isConnected(int p,int q); int find(int p); void union(int p,int q);}抽象类package com.c原创 2017-12-30 10:32:49 · 467 阅读 · 0 评论 -
Coding interview:替换字符串中的空格
这里利用一个技巧,首先统计出字符串中出现的空格数量,计算出替换之后总的数组长度,最后一定注意从后向前遍历进行替换。public String replaceSpace(String str,String replaceStr){ char[]origin = str.toCharArray(); char[] replaceChar = replaceStr.toCha原创 2018-05-05 21:15:28 · 162 阅读 · 0 评论 -
Coding interview :第一个没有重复的字符
思路:两次遍历,第一次遍历记录字符出现的次数,第二次找到第一个没有出现的字符。 代码如下:public char firstNotRepeat(char[]str){ if(str==null || str.length==0){ return ' '; } if(str.length==1){ retur原创 2018-05-05 23:08:58 · 142 阅读 · 0 评论 -
Coding interview:字符串反转
首先对整个句子反转,然后对其中每一个单词进行反转。void swap(char[]sentence,int i,int j){ char c = sentence[i]; sentence[i] = sentence[j]; sentence[j] = c; } void reverse(char[]sentence,int begin,原创 2018-05-05 23:24:50 · 178 阅读 · 0 评论 -
Coding Interview:最长子数组问题(2)
1.未排序的数组中累加和为小于或者等于给定值的最长子数组长度2.在二叉树中找到累加和为指定值的最长路径长度问题1令Subsum[j] 等于array{0…j}的累加和,则从0至j这部分中,最长子数组长度应为len = j-k; K为最先出现的SubSum[k]>=SubSum[j]-target 的位置。求最先出现的位置,我们需要辅助数组Fe.令Fe[i] = Max{Fe[i-...原创 2018-05-19 12:21:09 · 206 阅读 · 0 评论 -
Coding Interview:打印二叉树的边界节点
问题描述: 给定一颗二叉树的头节点,按照如下规则逆时针打印边界节点。 规则: 1.头节点为边界节点 2.叶节点为边界节点 3.如果节点在其所在的层中是最左或者最右的,也是边界节点。解题思路使用层次遍历,如果是一层开始的节点则直接打印,如果是一层中最后一个节点,则直接暂存起来,如果是叶子节点则直接打印,最后在逆序打印出暂存的节点。static class Node{ ...原创 2018-05-19 13:15:36 · 726 阅读 · 0 评论 -
Coding Interview:找到最大的搜索二叉子树
题目描述给定一颗二叉树的头节点,找到含有节点最多的搜索二叉子树,并返回这个树的头节点。解题思路后续遍历这个树,当前节点的值如果大于等于左子树中的最大值,并且小于等于右子树的最小值,并且左子树是搜索二叉树,并且右子树是搜索二叉树,则当前节点是搜索二叉树。否则,选择左,右子树中最大数量的即可。代码/** * 找到二叉树中最大的搜索二叉树 */public class Bi...原创 2018-05-26 23:27:06 · 517 阅读 · 0 评论 -
Coding interview: 找到二叉树中符合搜索二叉树条件的最大拓扑结构
题目描述给定一颗二叉树的头节点Head,已知所有节点的值都不一样,返回最大的且符合搜索二叉树的最大拓扑结构的大小。解题思路利用先序遍历,每一次可以限定子树中最大值和最小值,符合条件则计数+1,否则直接返回,无需遍历其子树。package com.codeinterview.tree;/** * 找到二叉树中符合搜索二叉树条件的最大拓扑结构 */public class...原创 2018-05-27 14:33:16 · 478 阅读 · 1 评论 -
Code interview 删除字符串中连续出现K个'0'
思路很简单,遍历数组遇到连续出现K个‘0’的情况就将其移除,就是用一个变量pos,其左侧是需要保留的字符(包括pos的位置)。 注意如果连续出现K+m 个0,m>0,这种情况是不需要移除的。下面给出代码:public String removeZero(String str,int k) { int len = str.length(); if(l...原创 2018-07-19 09:05:19 · 231 阅读 · 0 评论 -
Coding interview:添加最少字符使字符串整体为回文字符串
题目描述给定一个字符串str,如果可以在str的任意位置添加字符,请返回添加字符最少的情况下,让str整体都是回文字符串的一种结果。解题思路本题可以使用动态规划的思想,dp[i][j]表示子字符串(i,j)变成回文字符串需要添加的字符数,则有如下公式:1. 如果str[i]==str[j]时,dp[i][j] = dp[i+1][j-1];2. 如果str[I]!=str[j]时...原创 2018-09-08 23:38:45 · 600 阅读 · 0 评论 -
Coding interview:位运算
位运算总结1.交换两个数2.选择两个数中较大的一个3.位运算进行加减乘除下面给出代码//交换两个数public void swap(int a,int b) { a = a^b; b = a^b; a = a^b; System.out.println("a: " + a + " , b:" + b); }//...原创 2018-10-05 20:45:38 · 282 阅读 · 0 评论 -
Coding interview:位运算2
找出正数中二进制1出现的次数public int count1(int n) { int res = 0; while (n!=0){ res += n&1; n>>>=1; } return res; }其他数都出现偶数次的数组中,找到唯一个出现...原创 2018-10-06 16:08:25 · 221 阅读 · 0 评论 -
Coding interview:数组中未出现的最小正整数
题目描述给定一个无序整型数组array,找出数组中未出现的最小正整数.例如:[-1,2,3,4] 返回1[1,2,3,4] 返回5解题思路对于给定数组长度为N,我们希望数组中的数据为1,2,3,4…,N,这样最小的正整数则为N+1,但是事实情况并非我们所期待的这样,所以我们对数组进行一个划分,索引 i 左边的数组是从1开始逐个递增的,相差为1。索引 j 右边的数据是“无效数据”,“无效...原创 2018-10-28 14:40:58 · 338 阅读 · 0 评论 -
Coding interview:字符串的全排列
使用递归来解决问题,下面给出代码。void permutation(char[]str,int i){ if(i==str.length){ System.out.println(str); return; } for(int k=i;k<str.length;k++){ swap(s原创 2018-05-05 19:44:55 · 220 阅读 · 0 评论 -
Coding Interview:最长子数组问题(1)
1.未排序正数数组中累加和为给定值的最长子数组长度2.未排序数组中累加和为给定值的最长子数组长度(包含正数和负数)3.给定数组中包含正数、负数、0,求正数与负数相等的最长子数组的长度4.给定数组只包含1、0,求所有子数组中0、1个数相等的最长子数组的长度问题1使用left,right分别表示当前数组的开始和结束位置,累加和为Sum; case: sum>target 则...原创 2018-05-18 09:11:28 · 240 阅读 · 0 评论 -
算法:快速排序
快速排序的基本原理这里就不详细介绍了,下面给出快排的几种实现方式,以及优化。单项Partition对数组分段的时候我们采用从一端开始的方式,下面给出代码private int partion1Way(int[]a,int start,int end){ int i = start-1; int j = start; int k = a原创 2018-01-21 15:43:40 · 159 阅读 · 0 评论 -
算法 : 归并排序
归并排序实现以及空间优化自顶向下的归并排序//start 数组的开始位置,end数组结束位置,aux辅助数组public void mergeSortTop2Bottom(int[]a,int start,int end,int[]aux){//如果只有一个或者没有元素则直接返回啦 if(start>=end) return; //找到数组中间位置原创 2018-01-06 16:09:43 · 236 阅读 · 0 评论 -
算法:基于堆优先级队列
优先级队列的定义应用场景非常广泛,因为很多时候我们需要处理有序的元素,但是不一定要求全部的元素排序,这时候优先级队列就很适合。基于堆的优先级队列能高效的实现插入和删除操作,下面给出基于数组和堆的优先级队列。原创 2018-02-03 23:27:14 · 260 阅读 · 0 评论 -
Codeing Interview: 最大值减去最小值小于或者等于num的子数组数量
题目大意:给定一个数组array和数值num,计算出数组中有多少子数组,其最大值减去最小值满足小于或者等于num。例如: 给定数组(1,2,3,4,5,10)和 num=3 ,则其中(1,2)子数组的最大值减去最小值为1,则满足条件。要求:时间复杂度O(N)。解题思路1 当我们使用暴力方法的时候,我们可以以i 作为子数组的开头,然后看看有多少个满足情况的子数组。这样的做法时间复杂度为O(N2)。原创 2018-03-11 17:26:40 · 548 阅读 · 0 评论 -
算法:KMP算法实现
KMP算法KMP的主要思想是当文本串与模式串发生不匹配的时候,可以减少移动模式串的次数,或者是更加准确的移动模式串减少比较的次数。 所以需要对模式串进行预处理。原创 2018-02-25 13:55:24 · 334 阅读 · 0 评论 -
Coding intervew: 链表反转
单向链表反转static class Node { Node next; int val; Node(int v){ this.val = v; } } public static Node reverse(Node head) { Node pre = null;原创 2018-03-12 08:15:32 · 189 阅读 · 0 评论 -
Coding interview : 链表排序(选择,插入,快排,归并)
本文章分别给出链表排序的几种方法,对于学习如何操作链表很有帮助。原创 2018-03-18 21:59:45 · 212 阅读 · 0 评论 -
Coding interview: 二叉树的遍历(递归和非递归)
二叉树的非递归遍历就是使用数据结构栈来实现的,下面直接给出代码。前序遍历//递归static void recursionPreIterator(Node root){ if(root == null) { return; } System.out.println(root.v); recursionPreIt原创 2018-03-23 09:14:20 · 149 阅读 · 0 评论 -
Code interview:获取数组中最小的K个数
获取数组中最小的K个数,利用堆完成。public class MinKNum { public void createHeap(int[]heap){ int len = heap.length; int i = len >> 1; while(i >= 1){ sink(heap,i); i--;原创 2018-05-04 10:56:29 · 171 阅读 · 0 评论 -
Code interview: 连续数组最大和
void maxSubArray(int[] array){ if(array==null || array.length == 0) return; int max = 0,sum = 0,b = -1,e = -1, bt = -1; int len = array.length; for(int i=0;i<l原创 2018-05-04 11:32:40 · 214 阅读 · 0 评论 -
Code interview: 连续数组最大和 (二维数组)
思路与这边文章一致: https://blog.youkuaiyun.com/zhumingyuan111/article/details/80192729 因为是二维数组可以做一个预处理,可以使得在O(1)的时间复杂度获得到Array[low..hight][col]的值。 下面给出代码public void getMaxSubArray(int[][]array){ int row =原创 2018-05-04 13:01:52 · 216 阅读 · 0 评论 -
Coding interview :逆序对
结合归并排序的原理计算逆序对数,下面给出代码public int inversePair(int[]array){ if(array==null || array.length <= 1) return 0; int[]array2 = new int[array.length]; return inversePair(array,0,array.len原创 2018-05-04 14:53:10 · 145 阅读 · 0 评论 -
Leetcode: 992. Subarrays with K Different Integers
URL : https://leetcode.com/problems/subarrays-with-k-different-integers/思路:该题其实代码量不多,但是思路不好想,我是看了discuss才恍然大悟。下面给出代码。数组中最多出现K个不同的数字的组合数为N, 数组中最多出现K-1个不同的数字的组合数为M,则我们想要的结果是出现K个不同的组合数N-M.最多出现K个不同的数字...原创 2019-05-26 10:25:32 · 446 阅读 · 0 评论