算法
翁正存
做一名合格的工程师
展开
-
理解归并排序的递归算法时间复杂度
首先这棵递归树的高度为lgn,其次,每一层的合并最差的比较效率是n-1,即O(n),从底层开始合并的话,这棵合并树总共需要合并O(nlgn)原创 2020-02-17 21:23:03 · 835 阅读 · 0 评论 -
因式分解Java实现
package cun.zheng.weng.algorithmn.mathmatic;import java.util.ArrayList;import java.util.List;public class FindAllDivisors {List<Integer> result = new ArrayList<>();public List<Int...原创 2020-02-13 13:14:34 · 1057 阅读 · 0 评论 -
递归地打印链表
public class PrintListByRecursive { public static void printList(ListNode head) { if(head == null){ return; } System.out.println(head.val); printList(...原创 2019-03-15 09:55:19 · 363 阅读 · 0 评论 -
归并排序-自顶向下
归并排序的核心是不断地合并小数据集,直到整个集合都被排序。上两张图,很直观地说明了递归的过程:附上代码:public class MergeSort { //辅助数组 public static int[] aux; /** * 递归结束条件:hi <= lo * 对左半数组排序,对右半数组排序,合并两个有序子数组 ...原创 2019-03-15 19:13:04 · 544 阅读 · 0 评论 -
107. Binary Tree Level Order Traversal II
Given a binary tree, return thebottom-up level ordertraversal of its nodes' values. (ie, from left to right, level by level from leaf to root).For example:Given binary tree[3,9,20,null,null,15,7...原创 2019-03-18 16:37:35 · 129 阅读 · 0 评论 -
生成一棵二叉树
功能:给定一个数组,由此生成一棵二叉树。分解:1.考虑将一个节点加入树中,使用递归。2.考虑如何将整个数组依次加入树中,线性遍历。public class CreateBinaryTree { /** * 将一个节点加入二叉树 * @param val * @param head * @return */ pub...原创 2019-03-28 11:02:17 · 1939 阅读 · 0 评论 -
一致性哈希实现
public class ConsistenHashWithVN { private static String[] servers = { "192.168.0.0:111", "192.168.0.1:111", "192.168.0.2:111", "192.168.0.3:111",...转载 2019-04-24 15:35:25 · 172 阅读 · 0 评论 -
826. Most Profit Assigning Work
思路:如何处理3个数组之间的映射关系class Solution { public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int[] index = new int[worker.length]; for(int i = 0; i < wor...原创 2019-04-24 19:52:57 · 227 阅读 · 0 评论 -
680. Valid Palindrome II
class Solution { public boolean validPalindrome(String s) { int cnt = 0; if(checkStr(s, cnt)) { if(cnt < 2) { return true; } } ...原创 2019-04-30 16:32:18 · 153 阅读 · 0 评论 -
168. Excel Sheet Column Title
将整数按进制分解,可以是二进制、十进制、16进制等,本题是按照二十六进制分解。一般的方法就是取余数和取商结合。 public String convertToTitle(int n) { if(n <= 0) return ""; int basic = 26; List<Character> li...原创 2019-05-07 14:29:08 · 148 阅读 · 0 评论 -
171. Excel Sheet Column Number
还是考察同一个数,在不同进制下的表示。 public int titleToNumber(String s) { int basic = 26; int result = 0; int index = 0; while (index < s.length()) { result *= basi...原创 2019-05-07 15:19:18 · 127 阅读 · 0 评论 -
循环队列
仅仅是逻辑上的循环队列,物理上仍是连续的内存。public class CircleQueue { int front; int rear; int[] arr; int size; public CircleQueue() { front = -1; rear = -1; arr = new int...原创 2019-05-24 15:18:47 · 205 阅读 · 0 评论 -
滑动窗口的应用
一般地,求数组或字符串的最值问题,都可以使用滑动窗口。滑动窗口的最大特点:有效利用已有的中间结果,天然地适合解决最值问题。举个例子:3.Longest Substring Without Repeating Characterspublic class Solution { public int lengthOfLongestSubstring(String s) {...原创 2019-06-04 20:16:00 · 726 阅读 · 0 评论 -
二叉堆实现优先队列
优先队列支持两种操作:删除最大(小)元素和插入元素。public class MaxPQ<Key extends Comparable<Key>> { private Key[] pq; private int N = 0; public MaxPQ(int maxN) { pq = (Key[]) new Comparab...翻译 2019-07-05 14:01:56 · 378 阅读 · 0 评论 -
数组实现优先队列
优先队列支持的操作:插入元素和删除最大元素public class MaxPQByArr { //保存数值 private int[] arr; //最大元素所在数组的位置索引,N从1开始 private int N; private int len; public MaxPQByArr(int max) { arr =...原创 2019-07-06 16:35:23 · 1170 阅读 · 0 评论 -
用迭代的方式求斐波那契数
public class FibNumberByIteration { /** * 求索引为index的斐波那契数 * @param index * @return */ public static int fb(int index) { if(index <= 1) return index...原创 2019-08-27 20:31:22 · 423 阅读 · 0 评论 -
242. Valid Anagram
Given two stringssandt, write a function to determine iftis an anagram ofs.Example 1:Input: s = "anagram", t = "nagaram"Output: trueExample 2:Input: s = "rat", t = "car"Output: fal...原创 2019-03-04 17:28:51 · 160 阅读 · 0 评论 -
234. Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.Example 1:Input: 1->2Output: falseExample 2:Input: 1->2->2->1Output: true解决回文问题,关键是利用对称性,用首尾两个指针依次遍历链表,比较val的大小是否...原创 2019-03-04 16:29:12 · 162 阅读 · 0 评论 -
83. Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear onlyonce.Example 1:Input: 1->1->2Output: 1->2Example 2:Input: 1->1->2->3->3Output: 1-...原创 2019-03-09 17:54:46 · 109 阅读 · 0 评论 -
找出整数数组中任意重复的数字
整数数组arr大小为n,取值范围0~n-1,可能包含多个重复的数字,如果数组存在重复的数字,请找出数组arr中任意重复的数字。思路1:使用哈希表,遍历arr,依次将arr[i]存入哈希表,如果哈希表中已经存在arr[i],则表明arr[i]重复了。用这个方法,可以找出所有重复的数字,但是需要额外O(n)的空间,是以空间换时间。思路2:直接修改arr数组,遍历arr,如果arr[i] != ...原创 2019-01-12 14:22:25 · 1047 阅读 · 0 评论 -
位运算-移位和位与
public class BitOperation { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int value = sc.nextInt(); ...原创 2019-01-25 11:33:33 · 502 阅读 · 0 评论 -
重建二叉树
已知二叉树的前序和中序遍历序列,以此重建二叉树。重建二叉树,必须知道前序和中序序列,其他组合都不行。public class RebuildTree {class Node{int nodeValue; Nodeleft; Noderight; Node(){}Node(int nodeValue, Node left, N...原创 2019-01-23 11:02:13 · 175 阅读 · 0 评论 -
动态规划--将一段n米长的绳子切成m段
将一段n米长的绳子切成m段,保证m段绳子的乘积最大,其中m>1,n>1.满足f(n)=max(f(i)f(n-i)),从小规模的例子看起:f(1)=0f(2)=1f(3)=f(1)f(2)=1*2 > 1*1*1f(4)=f(1)f(3)=2或者f(4)=f(2)*f(2)=4,所以f(4)=4f(5)=f(1)f(4)=4或f(5)=f(2)f(3)=4...原创 2019-01-23 11:12:50 · 1713 阅读 · 0 评论 -
LeetCode 58. Length of Last Word
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string.If the last word does not exist, return 0.Note: A word is defin...原创 2019-02-21 19:53:11 · 200 阅读 · 0 评论 -
LeetCode 9. Palindrome Number
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.Example 1:Input: 121Output: trueExample 2:Input: -121Output: falseExpl...原创 2019-02-21 21:45:14 · 197 阅读 · 0 评论 -
LeetCode 14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings.If there is no common prefix, return an empty string "".Example 1:Input: ["flower","flow","flight"]Output:...原创 2019-02-22 14:03:17 · 167 阅读 · 0 评论 -
LeetCode 445. Add Two Numbers II
You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return i...原创 2019-02-23 15:31:12 · 175 阅读 · 0 评论 -
算法分析一般步骤
很多程序员都爱犯的一个毛病,就是刚开始动手写代码就想找到最优解,对那些已经被人解决过的问题,还可以通过网络获取最优化的解决方案,当进入一个全新的领域,这种想毕其功于一役的想法会限制人的能力,推迟项目进度。更一般的做法是:1)先分析问题,找到一个可行的方案2)将方案落地3)思考当问题规模增大一个量级(10倍)时,这套方案能在可接受的时间内给出问题答案吗4)如果随着问题规模不断增...原创 2019-02-25 10:50:05 · 6522 阅读 · 0 评论 -
贪心算法应用-哈夫曼编码
学习哈夫曼编码,最大的收获是学习了贪心算法的实现套路:每次的选择都是局部最优解。但是贪心算法不能保证最后得到整体最优解。public class HuffmanTree { public static <T> HuffmanNode<T> createHuffmanTree(List<HuffmanNode<T>> nodes...原创 2019-03-02 13:24:45 · 936 阅读 · 0 评论 -
LeetCode 38. Count and Say
The count-and-say sequence is the sequence of integers with the first five terms as following:1. 12. 113. 214. 12115. 1112211 is read off as "one 1" or 11.11 is read off ...原创 2019-02-26 17:36:16 · 144 阅读 · 0 评论 -
28. Implement strStr()
难点:当字符串部分匹配时,怎么回溯?class Solution { public int strStr(String haystack, String needle) { if(needle == null || needle.equals("")){ return 0; } if(haystack.length...原创 2019-03-08 17:38:48 · 156 阅读 · 0 评论 -
LeetCode 443. String Compression
Given an array of characters, compress it in-place.The length after compression must always be smaller than or equal to the original array.Every element of the array should be a character (not int...原创 2019-02-27 13:21:21 · 159 阅读 · 0 评论 -
单链表删除节点的方法
public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}删除一个单链表里的某个指定的节点:1.修改指针指向的对象 public static void deleteNodeV2(ListNode head, ListNode node) { if(...原创 2019-02-27 14:12:07 · 8610 阅读 · 0 评论 -
67. Add Binary
Given two binary strings, return their sum (also a binary string).The input strings are bothnon-emptyand contains only characters1or0.Example 1:Input: a = "11", b = "1"Output: "100"Exam...原创 2019-03-08 20:12:03 · 139 阅读 · 0 评论 -
查找整数数组中缺失的数字
数组arr大小为n,取值范围0~n-1,如果数组有重复数字,则某些数字就会缺失,试着找出缺失数字。思路:如果数组arr没有缺失数字,则含有n个数字的数字的数字正好覆盖0~n-1,如果某个数字重复出现,则必然有缺失的数字。可以新建一个大小为n的辅助数组copyArr,无需对原数组排序,直接遍历原数组,把下标i对应的数字arr[i]存入新数组的对应下标中。然后,遍历辅助数组,如果下标i与copyA...原创 2019-01-12 14:09:10 · 2878 阅读 · 0 评论