自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 终于明白IO多路复用了

为什么要有IO多路复用

2020-10-31 20:00:09 147

原创 LeetCode系列141—环形链表

2020-10-31 10:01:28 34

原创 剑指Offer系列11—旋转数组的最小数字

题意把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。问题分析class Solution {public: int minArray(vector<int>& numbers) { int low = 0; int high = numbers.size() - 1;

2020-10-31 10:01:15 63

原创 剑指Offer系列10-2—青蛙跳台阶问题

题意一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。问题分析与斐波那契数列类似class Solution {public: int numWays(int n) { int a = 1, b = 1, sum; for(int i = 0; i < n; i++) {

2020-10-30 20:57:22 60

原创 剑指Offer系列10-1—斐波那契数列

题意写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。问题分析递归会进行大量重复的计算,涉及大量重复计算的问题可以用动态规划来解决设dp[i]的

2020-10-30 20:45:26 148

原创 剑指Offer系列9—用两个栈实现队列

题意用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )问题分析class CQueue { LinkedList<Integer> A, B; public CQueue() { A = new LinkedList<Integer>(); B = new Li

2020-10-30 20:23:28 61

原创 剑指Offer系列7—重建二叉树

题意输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。问题分析递归不解释/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solut

2020-10-30 17:53:09 58

原创 剑指Offer系列6—从尾到头打印链表

题意输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。问题分析方法一:递归class Solution { ArrayList<Integer> tmp = new ArrayList<Integer>(); public int[] reversePrint(ListNode head) { recur(head); int[] res = new int[tmp.size()]; for(i

2020-10-30 16:12:35 93

原创 剑指Offer系列5—替换空格

题意请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000问题分析方法一:字符数组class Solution { public String replaceSpace(String s) { int length = s.length(); char[] array = new ch

2020-10-30 16:06:55 201

原创 剑指Offer系列3—数组中重复的数字

题意找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000问题分析方法一:排序class Solution {public: int findRepeatNumber(vector<int

2020-10-30 15:46:29 106

原创 剑指Offer系列68-2—二叉树的最近公共祖先

题意给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。问题分析class Solution: def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode: if not root or root == p or root == q: return root left = self.lowestCommonAncestor(root.left,

2020-10-30 11:28:43 56

原创 剑指Offer系列68-1—二叉搜索树的最近公共祖先

题意给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。问题分析class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { // if(root == NULL) return NULL; if(root->val > p->val && root->val > q-&g

2020-10-30 10:38:29 51

原创 剑指Offer系列67—把字符串转换成整数

题意写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一

2020-10-30 10:14:40 57

原创 剑指Offer系列66—构建乘积数组

题意给定一个数组 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]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 100000问题分析构造一个乘积矩阵,详情见《剑指Offer》class Solution { public int[] c

2020-10-29 17:36:19 57

原创 剑指Offer系列65—不用加减乘除做加法

题意写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。问题分析由于不能使用四则运算,只能考虑使用位元算class Solution {public: int add(int a, int b) { int sum; int carry; do{ sum = a ^ b; carry =(unsigned int)(a & b) <&l

2020-10-29 17:05:56 51

原创 剑指Offer系列62—圆圈中最后剩下的数字

题意0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3限制:1 <= n <= 10^51 <= m <= 10^6问题分析方法一:环形链表模拟圆圈(超时)class Solution {p

2020-10-29 16:13:24 44

原创 剑指Offer系列63—股票的最大利润

题意假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。限制:0 <= 数组长度 <= 10^5问题分析蛮力法的时间复杂度为O(n2)O(n^2)O(n2)应该用动态规划的思想来解决,

2020-10-29 15:04:46 69

原创 剑指Offer系列61-扑克牌中的顺子

题意从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。问题分析根据题意,5张牌是顺子的充分条件是:除大小王外,所有牌 无重复;设此 5 张牌中最大的牌为 max,最小的牌为 min (大小王除外),则需满足:max - min < 5方法一:集合+遍历//Javaclass Solution { public boolean isStraig

2020-10-28 14:40:47 96

原创 剑指Offer系列60—n个骰子的点数

题意把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。问题分析动态规划class Solution {public: vector<double> twoSum(int n) { vector<double> res; int dp[12][6*n+1]; memset(dp,0,sizeof(dp)); for(int i = 1; i &

2020-10-28 11:56:59 58

原创 剑指Offer系列59-2—队列的最大值

题意请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1问题分析与上题滑动窗口的最大值类似,用单调队列即可解决,同时维护一个辅助队列即可。class MaxQueue { queue<int> q; deque<int> d;public: MaxQueue() {

2020-10-28 10:19:31 76

原创 剑指Offer系列59-1—滑动窗口的最大值

题意给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。问题分析单调队列//C++class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> res; deque<int> dq; int len = nums.size();

2020-10-28 09:52:37 74

原创 剑指Offer系列57-2—和为s的连续正数序列

题意输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]问题分析双指针//C++class Solution {public: vector<vector<int>> findContinuousSequence(int target){ vector<ve

2020-10-27 20:54:15 186

原创 剑指Offer系列57-1—和为s的两个数字

题意输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]问题分析双指针//C++class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int l = 0;

2020-10-27 20:04:18 64

原创 剑指Offer56-2—数字中唯一只出现一次的数字

题意在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4限制:1 <= nums.length <= 100001 <= nums[i] < 2^31问题分析采用异或无法解决问题,因为3个相同的数字的异或结果还是该数字,但是还是可以沿用位运算的思路。如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表

2020-10-27 19:45:04 114

原创 剑指Offer系列56-1—数组中数字出现的次数

题意一个整型数组nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]限制:2 <= nums.length <= 10000问题分析分组异或先对所有数字进行一次异或,得到两个出现一次的数字的异或值。在异或结果中找到任意为 11 的位。根据这一位对所有的数字进行分组。在每个组内进行异或操作,得到两个数字。c

2020-10-27 16:59:59 122

原创 剑指Offer系列55-2—平衡二叉树

题意输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。问题分析方法一:先序遍历+判断深度此方法简单,但会产生大量重复的运算,在求根节点和左右孩子的深度时,重复遍历,导致时间复杂度为O(nlogn)O(nlogn)O(nlogn)class Solution {public: bool isBalanced(TreeNode* root) { if(root == NULL)

2020-10-27 16:32:01 60

原创 剑指Offer系列54—二叉搜索树的第k大节点

题意给定一棵二叉搜索树,请找出其中第k大的节点。问题分析中序遍历二叉搜索树可以得到一个递增的序列,求第k大的节点需要序列是递减的,因此求中序遍历的倒序即可dfs(root->right)...dfs(root->left)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *

2020-10-27 13:28:31 70

原创 剑指Offer系列53-3—数组中数值和下标相等的元素

题意假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如:在数组{-3, -1, 1, 3, 5}中,数字3和它的下标相等。问题分析二分查找int GetNumberSameAsIndex(vector<int>& nums){ int l = 0; ing r = nums.size(); while(l <= r){ int mid = l + ((r - l) >> 1);

2020-10-27 13:08:08 81

原创 剑指Offer系列53-2—0~n-1中缺失的数字

题意一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000问题分析又是排序数组的查找问题,自己画图理解一下即可,如果查找结果等于下标,说明数组左边没有缺失,则l = mid + 1,否则r = mid -

2020-10-27 12:52:31 58

原创 剑指Offer系列53-1—在排序数组中查找数字

题意统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000问题分析排序数组的搜索问题,首先想到二分查找,关于二分查找,请看二分查找那点事根据题目要求,必须找到数字在数组中的左边界和右边界,下面代码中getFrist()和getLast()函数分别寻找数

2020-10-27 12:27:40 68

原创 二分查找那点事

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky…这句话可以这样理解:思路很简单,细节是魔鬼。本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且

2020-10-27 09:30:47 817

原创 剑指Offer系列52—两个链表的第一个公共节点

题意输入两个链表,找出它们的第一个公共节点。问题分析方法一:蛮力法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *getIntersectionNode(L

2020-10-26 16:03:17 58

原创 剑指Offer系列51—数组中的逆序对

class Solution {public: int reversePairs(vector<int>& nums) { if(nums.size() == 0) return 0; int n = nums.size(); vector<int> tmp(n); for(int i = 0; i < n; i++) tmp[i] = nums[i

2020-10-26 15:46:29 47

原创 剑指Offer系列50—第一个只出现一次的字符

题意在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "限制:0 <= s 的长度 <= 50000问题分析最直观的想法是从头开始扫描这个字符串中每个字符,当访问到某字符时,拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的元素,则该字符就是只出现一次的字符。时间复杂度为O(n2)O(n^2)O(n2)可以构造一个哈希表,key为字符的ASCI

2020-10-26 10:58:17 116

原创 剑指Offer系列49—丑数

代码class Solution {public: int nthUglyNumber(int n) { int a = 0, b = 0, c = 0; vector<int> uglyNumbers(n,0); uglyNumbers[0] = 1; for(int i = 1; i < n; i++){ uglyNumbers[i] = min(min(uglyNumbers[a]*2

2020-10-26 10:15:24 124 1

原创 剑指Offer系列48—最长不含重复字符的子字符串

题意

2020-10-26 00:02:07 41

原创 剑指Offer系列46—把数字翻译成字符串

题意给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”提示:0 <= num < 231问题分析很明显是动态规划问题设数字num的第i位数

2020-10-25 18:01:30 85

原创 剑指Offer系列45—把数组排成最小的数

题意输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0问题分析代码class Solution {public:

2020-10-23 16:50:58 46

转载 C++比较字符串的字典序

strcmp(s1, s2)在 C 语言中,我们可以使用 strcmp() 函数比较 char* 类型字符串的字典序。当字符串 s1 的字典序小于字符串 s2 的字典序时,返回值 < 0。当字符串 s2 的字典序大于字符串 s1 的字典序时,返回值 > 0。当字符串 s1 的字典序等于字符串 s2 的字典序时,返回值 = 0。#include <iostream>using namespace std;int main() { char s1[2] = "

2020-10-23 16:40:10 4356

原创 剑指Offer系列38—字符串的排列

题意输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]限制:1 <= s 的长度 <= 8问题分析深度优先搜索+回溯代码Javaclass Solution { List<String> res = new LinkedList<>(); char[] c;

2020-10-23 12:57:52 359

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除