
算法系列
文章平均质量分 70
常见算法题总结,包含LeetCode 《剑指offer》以及一些常见的算法面试题。
BridgeGeorge
脚踏实地,展望未来
展开
-
算法系列——开篇及目录
前言题目来源于leetcode网站 原题以及 《剑指offer》。数学运算Add Two NumbersReverse IntegerString to Integer (atoi)Palindrome NumberInteger to RomanRoman to IntegerDivide Two IntegersMultiply StringsPow(x, n原创 2017-08-15 11:19:33 · 430 阅读 · 0 评论 -
算法系列——寻找数组中心下标
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。给你一个整数数组 nums ,请计算数组的 中心下标。原创 2024-02-28 16:24:28 · 231 阅读 · 1 评论 -
判断子序列
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。题目:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。原创 2024-02-28 15:27:33 · 227 阅读 · 0 评论 -
算法系列——缺失的第一个正整数
题目你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。思路哈希法hash 计数:需要额外的空间。所有出现的数字,hash 值 + 1。第二次从 1 开始查找 hash 表,找不到就是它了。但是这种方案不符合题意,而且 hash 计数这个方案效率也不是最优的。置换法(待补充)代码class Solution { public int firstMissingPositive(int[] n原创 2022-05-19 18:58:41 · 417 阅读 · 1 评论 -
算法系列——接雨水
题目原题链接:https://leetcode.cn/problems/trapping-rain-water给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。思路暴力解法:不断循环,找到height[1,i-1] height[i+1,height.length-2] 两者之间的较小值复杂度:时间复杂度O(n²) 空间复杂度O(1)双指针解法:准备双指针,分别指向数组首尾元素,代表最初的两个边界;指针往中间遍历,遇到更低柱子就原创 2022-05-18 15:39:41 · 498 阅读 · 0 评论 -
算法系列——删除链表中的节点
题目题目链接:https://leetcode.cn/problems/delete-node-in-a-linked-list请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。题目数据保证需要删除的节点 不是末尾节点 。思路以通过修改node 的next 指针的指向,删除 node 的下一个节点。但是题目要求删除 node,为了达到删除node 的效果,只要在删除节点之前,将 node 的节点值修改为 no原创 2022-05-12 00:10:27 · 767 阅读 · 0 评论 -
算法系列——链表的奇偶重排
题目给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。题目链接:https://leetcode-cn.com/problems/odd-even-linked-list/思路双指针法,注意指针的指向。代码class Solution { public ListNode oddEvenList(ListNode head) { if原创 2022-05-06 01:28:53 · 948 阅读 · 0 评论 -
算法系列——重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。思路前序遍历列表:第一个元素永远是 【根节点 (root)】中序遍历列表:根节点 (root)【左边】的所有元素都在根节点的【左分支】,【右边】的所有元素都在根节点的【右分支】算法思路:通过【前序遍历列表】确定【根节点 (root)】将【中序遍历列表】的节点分割成【左分支节点】和【右分支节点】递归寻找【左分支节点】中的【根节点 (left child)】和 【右分原创 2022-05-05 22:36:10 · 346 阅读 · 0 评论 -
算法系列——字符串旋转
题目字符串旋转:给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(可以为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’切割换位后得到‘zanyou’和B相同,返回true。再如:如果A=‘abcd’,B=‘abcd’,A切成‘abcd’和’’(空串),换位后可以得到B,返回true。数据范围:A,B字符串长度满足 n \le 1000n≤1000,保证字符串中原创 2022-04-17 00:25:38 · 751 阅读 · 0 评论 -
算法系列——合并K个升序链表
题目题目链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表思路分治法 子问题为合并两个升序链表;代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN原创 2022-04-10 12:41:21 · 352 阅读 · 0 评论 -
算法系列——k个一组翻转链表
题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。思路核心过程就是 反转 [a,b) 之间的链表。然后递归调用此过程。代码实现/** * Definition for singly-linked list. * public class原创 2022-04-10 11:59:14 · 230 阅读 · 0 评论 -
算法系列——割绳子(剑指offer)
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。思路dp[n] 表示 长度为n 的绳子 能剪成出的最大乘积。dp[n]=max(dp[n-i]*dp[i]) n>=4为了方便处理 初始化时dp[1]=1; dp[2]=2原创 2022-03-15 21:46:36 · 915 阅读 · 0 评论 -
算法系列——圆圈中剩下的数字(剑指offer)
题目原创 2022-03-15 19:12:17 · 238 阅读 · 0 评论 -
算法系列——左旋字符串(剑指offer)
题目原题连接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrl原创 2022-03-28 13:15:27 · 178 阅读 · 0 评论 -
算法系列——栈的压入弹出序列(剑指offer)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路程序实现原创 2022-03-15 15:56:27 · 182 阅读 · 0 评论 -
算法系列——扑克牌中的顺子(剑指offer)
题目原创 2022-03-15 15:33:16 · 338 阅读 · 0 评论 -
算法系列——数值的整数次方(剑指offer)
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路看到了很多人会这样写:public static double powerWithExponent(double base,int exponent){ double result = 1.0; for(int i = 1; i <= expo原创 2017-09-05 12:24:31 · 442 阅读 · 0 评论 -
算法系列——n个骰子的点数(剑指offer)
题目描述把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s。输入 n,打印出 s 的所有可能的值出现的概率。解题思路此题目解法很多,其中使用动态规划法最好理解,代码也比较简洁1.现在变量有:骰子个数,点数和。当有c个骰子,点数和为k时,出现次数记为dp(c,k)。那与c-1个骰子阶段之间的关系是怎样的? 2.当我有c-1个骰子时,再增加一个骰子,这个骰子的点数只可能为1、2、3、4、5或6。原创 2017-09-01 17:50:07 · 4196 阅读 · 2 评论 -
算法系列——滑动窗口最大值(剑指offer)
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,原创 2017-09-04 15:05:15 · 1461 阅读 · 0 评论 -
算法系列——数组中出现次数超过一半的数字(剑指offer)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路排序法将数组进行排序,数组中元素个数超过一半的元素必定在中间位置,直接返回中间位置的元素即可。 排序算法最好的平均时间复杂度为O(nlogn),空间复杂度为O(1)哈希表遍历原创 2017-08-29 11:32:46 · 1076 阅读 · 0 评论 -
算法系列——寻找旋转排序数组中的最小值(剑指offer)
题目已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个元素值 互不相同 的数组 nu原创 2022-03-27 01:07:35 · 1261 阅读 · 0 评论 -
算法系列——在O(1)时间内删除链表结点(剑指offer)
题目描述给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点。解题思路程序实现原创 2017-09-01 14:39:15 · 795 阅读 · 0 评论 -
算法系列——替换空格(剑指offer)
##题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。原创 2017-08-25 12:27:32 · 847 阅读 · 0 评论 -
算法系列——二叉搜索树和双向链表(剑指offer)
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路程序实现原创 2017-08-28 10:32:16 · 596 阅读 · 0 评论 -
算法系列——跳台阶(Climbing Stairs)
爬楼梯问题是一个经典的递归斐波那契数列问题。这个问题也见于leetcode (www.leetcode.com)网站中。今天来说说它。问题描述原文 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how原创 2015-09-14 23:37:21 · 1046 阅读 · 0 评论 -
算法系列——变态跳台阶(剑指offer)
##题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。原创 2017-08-25 10:08:59 · 546 阅读 · 0 评论 -
算法系列——矩形覆盖(剑指offer)
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路本质是一个菲波那切数列,将n个2*1的小矩形无重叠地覆盖一个2*n的大矩形的方法数记为f(n)。以n=3,为例,当竖着放的时候,右边还剩下2*2的区域,这种情况下的覆盖方法记为f(2),当横着放在左上角的时候,左下角必须横着放一个2*1的小矩形,因此右边还剩原创 2017-08-25 09:40:39 · 1515 阅读 · 0 评论 -
算法系列——用栈实现队列(Implement Queue using Stacks)
Implement the following operations of a queue using stacks. push(x) – Push element x to the back of queue. pop() – Removes the element from in front of queue. peek() – Get the front element.原创 2017-07-11 10:17:43 · 347 阅读 · 0 评论 -
算法系列——用队列实现栈(Implement Stack using Queues)
Implement the following operations of a stack using queues. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() – Get the top element. empty() – Return原创 2017-07-11 11:58:08 · 395 阅读 · 0 评论 -
算法系列——包含min函数的栈(Min Stack)
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top()原创 2017-07-12 15:18:29 · 463 阅读 · 0 评论 -
算法系列——从尾到头打印链表(剑指offer)
##题目描述输入一个链表,从尾到头打印链表每个节点的值。##解题思路###栈可以利用栈先进后出的特性,将结点依次进栈。最后再依次出栈即可。###递归法同样可以利用递归的方法。原创 2017-08-25 11:32:19 · 672 阅读 · 0 评论 -
算法系列——机器人的运动范围(剑指offer)
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路这个方格也可以看出一个 m*n 的矩阵。同原创 2017-09-04 10:17:51 · 1806 阅读 · 0 评论 -
算法系列——不用加减乘除做加法(剑指offer)
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式计算二进制值相加: 5原创 2017-08-30 16:55:23 · 914 阅读 · 1 评论 -
算法系列——调整数组顺序使奇数位于偶数前面(剑指offer)
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路提供以下下两种方法相对位置不发生变化可以创建两个数组,分别存储原数组中奇数和偶数,然后在复制到原数组当中。 空间复杂度为O(n),时间复杂度为O(n)相对位置发生变化双指针法 1. 使指针l 向后遍历,直到指向原创 2017-08-25 16:57:46 · 769 阅读 · 0 评论 -
算法系列——数组中的重复数字(剑指offer)
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路排序法直接对数组进行排序,然后遍历数组即可。 时间复杂度为O(nlogn).空间复杂度O(1)哈希表用哈希表统计每个数原创 2017-08-30 17:29:34 · 1651 阅读 · 1 评论 -
算法系列——求平方根(剑指offer)
题目描述Implement int sqrt(int x).Compute and return the square root of x.解题思路程序实现public class Solution { public int mySqrt(int x) { if(x==0) return 0; int lef原创 2017-12-14 19:34:43 · 956 阅读 · 0 评论 -
算法系列——构建乘积数组(剑指offer)
题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法.解题思路下三角用连乘可以很容求得,上三角,从下向上也是连乘。 因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。程序实现原创 2017-08-30 20:31:27 · 470 阅读 · 0 评论 -
算法系列——排序算法总结
排序分类按照是否在内存中分类根据在排序过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序。对于内排序来说,排序算法的性能主要是受3个方面影响: 时间性能,辅助空间,算法的复杂性。按照算法的实现复杂度分类简单算法冒泡排序、简单选择排序和直接插入排序属于简单算法改进算法希尔排序、堆排序、归并排序、快速排序属于改进算法。各种排序算法分析和原创 2017-12-17 22:48:40 · 853 阅读 · 0 评论 -
算法系列——字符串匹配朴素算法和KMP算法
字符串匹配算法主要是两类,最基本的暴力解法,也叫做朴素算法,另一种是KMP算法。本篇给出两种算法的最简单化的写法,便于面试时记忆和书写,当然重点还是理解其算法思想。朴素匹配算法被搜索的字符串称为主串,待搜索的字符串称为模式串。朴素模式匹配算法的基本思想: 对主串的每一个字符作为子串开头,与模式串进行匹配。对主串做大循环,每个字符开头做模式串长度的小循环,直到匹配成功或全部遍历完成为止。Java原创 2017-12-17 15:24:43 · 2549 阅读 · 0 评论 -
算法系列——二分查找算法及其变体总结
基础二分查找只能找到指定target在序列中的位置,假如target有重复值,二分查找只能返回其中某个target的位置,这个位置并不确定,主要跟target值的起始位置和重复序列的长度有关系。原创 2017-12-18 00:07:30 · 1854 阅读 · 3 评论