算法数据结构
文章平均质量分 61
okiwilldoit
这个作者很懒,什么都没留下…
展开
-
LRU算法实现
最近最少使用算法,主要思路:双链表:双链表存储数据,插入和删除元素都很方便,复杂度都是O(1)。头节点是最近使用的元素,尾节点是最近最少使用空间满了的话,就淘汰尾节点,新增元素时,放在头节点。。为什么不用数组,因为插入和删除需要平移元素,复杂度是O(n)。哈希map:用于查找数据,key是数据的key,value是数据的指针(即数据在双链表中的位置)最大容量:如果超过容量,就把尾节点淘汰,新数据添加到头节点。原创 2023-11-30 10:38:12 · 427 阅读 · 0 评论 -
链表中的节点每k个一组翻转
描述将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。示例1输入:返回值:示例2输入:{},1返回值:{}原创 2023-11-29 14:21:34 · 114 阅读 · 0 评论 -
GeoHash算法简介
一. 基本原理GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。我们知道,经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。如果以本初子午线、赤道为界,地球可以分成4个部分。如果纬度范围[-90°, 0°)用二进制0代表,(0°, 90°]用二进制1代表,经度范围[-180°, 0°)用二进制0代表,(0°, 180°]用二进制1代表,那么地球可以转载 2021-07-19 15:35:42 · 19749 阅读 · 3 评论 -
SHA-1哈希函数
import java.util.Scanner;public class SHA1 { private final int[] abcde = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 }; // 摘要数据存储数组 private int[] digestInt原创 2013-09-21 16:35:32 · 1058 阅读 · 0 评论 -
最长公共子序列(连续)
构造m*n的矩阵,相等的那个位置等于1。此方法只能找到一个最长公共子序列,能得到长度public static LCS(String s1,String s2){//此方法只能找出一个LCS int m = s1.length(); int n = s2.length(); int max = 0; //记录最长字串长度 int lastIndex = 0;//记录公共字串原创 2013-09-28 15:52:18 · 626 阅读 · 0 评论 -
Unique Binary Search Trees
定义Count[i] 为以[0,i]能产生的Unique Binary Tree的数目,如果数组为空,毫无疑问,只有一种BST,即空树,Count[0] =1如果数组仅有一个元素{1},只有一种BST,单个节点Count[1] = 1如果数组有两个元素{1,2}, 那么有如下两种可能1 2 \原创 2013-10-28 13:49:19 · 486 阅读 · 0 评论 -
Gray Code
Gray Code的性质:相邻连续的两个二进制串,有且只有一位不同。Gray Code与二进制码的转换将连续的十进制数转化为对应的Gray Code,规律是:Gray Code=i^(i例如:2位Gray Code码与二进制码的对应关系如下:十进制 二进制码 格雷码0原创 2013-11-26 17:38:56 · 536 阅读 · 0 评论 -
Longest Common Prefix
思路:考虑两个字符串的最长前缀,然后遍历所有字符串,求出已得到的最长前缀与该字符串的最长前缀。在遍历的过程中,如果最长前缀为空,则跳出循环,返回“”public String longestCommonPrefix(String[] strs) { int m = strs.length; if(m == 0){ return "";原创 2013-11-30 11:13:12 · 508 阅读 · 0 评论 -
两个有序数组合并,并求中位数(复杂度为O(m+n))
先将两个有序数组合并成为一个有序数组,然后再求中位数。合并时,判断条件是i特别注意,中位数用double,int数据进行计算时,要先转化为double(直接赋值即可),然后再计算public double findMedianSortedArrays(int A[], int B[]) { int l1 = A.length; int l2 = B.原创 2013-11-30 11:34:52 · 2105 阅读 · 0 评论 -
Container With Most Water
public int maxArea(int[] height) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int i = 0;原创 2013-11-30 10:08:10 · 447 阅读 · 0 评论 -
Remove Duplicates from Sorted Array
Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.Do not allocate extra space for another array, you must do this in place with原创 2013-12-30 13:24:12 · 409 阅读 · 0 评论 -
ZigZag Conversion 锯齿形转换字符串
思路:根据锯齿形状,可以得到结论第i行的字符下标之间的距离是(nRows-1-i)*2和2*i,如下图所示:0 61 5 72 4 83 9根据这个规律,遍历每一行的元素,得到转换后的字符串。注意两点:1. 当s.length 时,无需转换,直接返回,否则会超时。2. 在遍历每一行时,原创 2014-01-11 15:56:29 · 898 阅读 · 0 评论 -
Word Break
For example, givens = "leetcode",dict = ["leet", "code"].Return true because "leetcode" can be segmented as "leet code".第一种解法:递归。结果超时!!!public boolean wordBreak(String s, Set dic原创 2014-01-14 18:28:00 · 409 阅读 · 0 评论 -
股票交易类算法
求一组数中最大差问题(只能是后面的数减前面的数)暴力n2,显然不行可以转化一下思路,求出两两相邻数的差,求一系列差值的最大连续子序列和,问题就转化为Maximum Subarray问题注意两点:收益不能为负,所以如果求出来的值小于0,输出0如果给出的数组只有一个数,也输出0public int maxProfit(int[] price原创 2014-01-23 12:27:31 · 836 阅读 · 1 评论 -
Binary Tree Level Order Traversal II
在层次遍历的基础上,反转ArrayList>就可以了public ArrayList> levelOrderBottom(TreeNode root) { ArrayList> lists = new ArrayList>(); if(root == null)return lists; Queue Q = new ArrayDeque(原创 2014-01-23 16:38:04 · 464 阅读 · 0 评论 -
Search a 2D Matrix
典型的二分法查找,注意循环条件是lowpublic boolean searchMatrix(int[][] matrix, int target) { int row = matrix.length; if(row == 0)return false; int column = matrix[0].length; int cou原创 2014-01-24 19:49:41 · 422 阅读 · 0 评论 -
Same Tree
思路:分类讨论,递归public boolean isSameTree(TreeNode p, TreeNode q) { return isSameTreeUtil(p,q); } boolean isSameTreeUtil(TreeNode p, TreeNode q){ if(p==null && q==null){原创 2014-01-17 17:32:39 · 421 阅读 · 0 评论 -
Single Number
一组数中,只有一个数出现一次,其他数都出现了2次,找到这个数方法一:用map,key是这个数,value用作统计这个数出现的次数遍历map的key,输出value=1的那个keypublic int singleNumber(int[] A) { int length = A.length; Map map = new HashMap(); for(原创 2014-01-18 13:54:10 · 453 阅读 · 0 评论 -
Search Insert Position
就是一个二分查找的问题public int searchInsert(int[] A, int target) { int high = A.length-1; int low = 0,middle=0; while(low <= high){ int midindex = (low+high)/2;原创 2014-01-18 17:34:06 · 453 阅读 · 0 评论 -
Convert Sorted Array to Binary Search Tree
把一个有序序列转化为平衡二叉排序树用递归,类似二分构建,找到middle,作为根节点public TreeNode sortedArrayToBST(int[] num) { int len = num.length; TreeNode root = build(num,0,len-1); return root; }原创 2014-01-26 20:27:55 · 447 阅读 · 0 评论 -
Remove Duplicates from Sorted Array II
与Remove Duplicates from Sorted Array不同的是:如果len遍历数组的过程中,删除数的条件是连续三个数相等,删除最后一个数,并且前移后面的数;如果不符合这个条件,才继续向前遍历,否则继续比较。public int removeDuplicates(int[] A) { int len = A.length; if(le原创 2014-01-26 21:07:52 · 376 阅读 · 0 评论 -
Plus One
思路:1.如果最后一位小于9,则digits[length-1]++,返回2.如果最后一位大于8,则循环访问数组,直至某位数3.如果最后得到的进位>0,则需要将数组长度扩大1,原来的数组往后平移public int[] plusOne(int[] digits) { int length = digits.length; int add = 0,i原创 2014-01-26 15:57:11 · 469 阅读 · 0 评论 -
Length of Last Word
很简单,按“ ”分割就可以了,Java中有s.split()函数public int lengthOfLastWord(String s) { String[] strArray = s.split(" "); if(strArray.length == 0)return 0; return strArray[strArray.length-1]原创 2014-01-19 15:47:38 · 455 阅读 · 0 评论 -
Pascal's Triangle II
帕斯卡三角:11 11 2 11 3 3 11 4 6 4 1。。。。要求只允许O(k)空间每增加一层ArrayList就增加一个1在每一层,从第二个数开始修改,直至修改到倒数第二个数,在修改之前要把原来的值保存,以备下次相加public ArrayList getRow(int rowIndex) { Ar原创 2014-01-27 13:21:22 · 401 阅读 · 0 评论 -
Climbing Stairs
经典dp问题 设置一个数组dp[i]表示i层楼梯有多少种方法dp[1]=1;dp[2]=2;dp[i]=dp[i-1]+dp[i-2];i层楼梯最后时,要么走一步,要么走两步,所以有上面的等式最后返回dp[n]public int climbStairs(int n) { if(n == 0 || n==1)return n; int原创 2014-01-19 16:22:53 · 407 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
定义两个数组,一个boolean[],记录是否出现过这个字符,一个int[],记录该字符上一次出现的位置,数组下标是字符的ASCII码设置一个begin指针,每次遇到相同字符时,begin重新置为i;特别注意,遇到相同字符时,就要重新计算长度,所以从上一次begin到这个字符上一次出现的位置,这之间的字符布尔数组应该设置为falsepublic int lengthOfLongestS原创 2014-01-19 20:37:52 · 456 阅读 · 0 评论 -
Remove Duplicates from Sorted List
遍历list,如果遇到相等的数,就删除那个节点,否则指针前移public ListNode deleteDuplicates(ListNode head) { ListNode p = head; while(p != null && p.next!= null){ if(p.val == p.next.val)p.next=p.nex原创 2014-01-19 16:06:27 · 427 阅读 · 0 评论 -
Add Binary
从末尾开始相加,本位和进位,得到的本位直接替换掉长串的那一位;如果进位==0且短串已全部遍历完,则跳出循环;跳出循环后,再判断进位是否>0,大于的补上1。public String addBinary(String a, String b) { int l1 = a.length()-1; int l2 = b.length()-1; int原创 2014-02-22 13:38:42 · 489 阅读 · 0 评论 -
Validate Binary Search Tree
用递归,设置最大值,最小值,与根节点的值比较。public boolean isValidBST(TreeNode root) { int min = Integer.MIN_VALUE; int max = Integer.MAX_VALUE; return isBSTHelper(root,min,max); } b原创 2014-02-23 11:43:58 · 486 阅读 · 0 评论 -
Search in Rotated Sorted Array II
旋转有序数组:将一个有序数组,把某个元素之后的元素旋转到第一个元素的前面例如:1234567将4之后的元素旋转后得到旋转有序数组:5671234;1111113将第2个元素之后的元素旋转得到:1111311思路:与二分法的思路类似设left和right,求出middle;首先,【left,middle】和【middle,right】中肯定有一段是有序数列。如果middle原创 2014-02-11 19:18:58 · 583 阅读 · 0 评论 -
Populating Next Right Pointers in Each Node和 II
二叉树层次遍历的变种用辅助队列,一层一层地遍历每一层的元素,先出队的元素的next是后一个出队的元素每一层最后一个元素的next=nullpublic void connect(TreeLinkNode root) { Queue Q = new ArrayDeque(); if(root == null)return; Q.offer(原创 2014-01-26 19:51:15 · 504 阅读 · 0 评论 -
Unique Paths
动态规划设置dp[i][j]表示走到【i】【j】位置有多少种方法;有两种方法可以走到【i】【j】,一种是从【i-1】【j】位置走到,一种是从【i】【j-1】位置走到。所以有:dp[i][j]=dp[i-1][j]+dp[i][j-1];其中第一行和第一列的所有位置都只有一种可能可以走到(直行)public int uniquePaths(int m, int n) {原创 2014-02-14 14:28:14 · 467 阅读 · 0 评论 -
Unique Paths II
在Unique Paths的问题上增加了阻碍。如果【i】【j】上有阻碍,则dp[i][j]=0;否则dp[i][j]=dp[i-1][j]+dp[i][j-1];初始化第一行和第一列的时:第一行:dp[i][j]=dp[i][j-1];第一列:dp[i][j]=dp[i-1][j];而dp[0][0]的值由obstacleGrid[0][0]来决定。public int原创 2014-02-14 15:25:01 · 454 阅读 · 0 评论 -
Set Matrix Zeroes
思路:先遍历一遍数组,用布尔数组记录下有0元素的行和列,然后再遍历数组,利用布尔数组对对应元素置0。题目要求用O(m+n)的空间复杂度,所以不能用二维布尔数组,应用两个一维布尔数组,一个记录行出现0的位置,一个记录列出现0的位置。public void setZeroes(int[][] matrix) { int rowsize = matrix.length;原创 2014-02-14 13:26:46 · 555 阅读 · 0 评论 -
Search in Rotated Sorted Array
思路与Search in Rotated Sorted Array II相同不同的是,这里数组中没有重复的数,所以也就不用单独考虑A[middle] = A[low]或A[middle] = A[high]的情况了。public int search(int[] A, int target) { int length = A.length; if(lengt原创 2014-02-15 15:06:08 · 434 阅读 · 0 评论 -
Minimum Path Sum
DP问题设置数组dp[i][j]表示到达grid[i][j]的最短路径,那么dp[i][j] = min{dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]}public int minPathSum(int[][] grid) { int m = grid.length; int n = 0; if(原创 2014-02-17 14:11:02 · 438 阅读 · 0 评论 -
Sqrt(x)
求平方根,牛顿迭代法牛顿迭代法 为了方便理解,就先以本题为例: 计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如左图所示。 首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。 同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x原创 2014-02-18 17:07:40 · 497 阅读 · 0 评论 -
3Sum Closest
与3Sum问题思路相同。先排序,再固定一个值,设置左右指针,两边夹。要找的是最接近的,如果找到了这个数,则直接返回这个数;如果没有找到这个数,设置一个记忆值,记忆差值,如果新的差值比原来的小,则替换返回值和记忆值。算法复杂度:O(nlogn)+O(n2)=O(n2)public int threeSumClosest(int[] num, int target) {原创 2014-02-19 11:12:12 · 426 阅读 · 0 评论 -
Valid Palindrome
设置两个指针,两边夹,另写一个函数判断字符是否是字符数字左边不是字符数字,向前移,否则,右边不是字符数字,向前移,否则,如果左右两边都是数字字符,则比较它们是否相等(或者是大小写切换)如果不相等,则左右都向前移动一个public boolean isPalindrome(String s) { int length = s.length(); i原创 2014-02-18 20:53:46 · 507 阅读 · 0 评论 -
判断数字是否是回文数字(无需另外开销)
如121是回文,负数不是回文。思路:求它的逆序数,看它们是否相等。逆序数的求法在Reverse Integer中有public boolean isPalindrome(int x) { if(x<0){ return false; } int a = x; int y = 0; whil原创 2013-11-06 16:21:18 · 650 阅读 · 0 评论