![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 50
郭同学如是说
在这里亟需一个宏大的的沉思。
展开
-
【大厂HOT100题】无重复字符的最长子串
原题链接:无重复字符的最长子串题意:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。思路暴力枚举:[i,j]可以记录一个区间,如果暴力枚举的话,就成了n个人之间任取两个人握手的问题,则算法复杂度为O(n2)O(n^2)O(n2)哈希表+双指针算法优化:枚举出以j为结尾的区间,使得[i,j]为无重复字符的最长子串。如果j++后使得[i,j]不满足为无重复字符的最长子串,则必定要i++,直到满足条件对字符的个数统计使用unordered_map完成cnt用于个数原创 2021-12-24 16:01:21 · 180 阅读 · 0 评论 -
【大厂HOT100题】数组中的第K个最大元素
原题连接:数组中的第K个最大元素题意:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。思路一:快速排序手写快排,返回nums[k-1]即可三分钟学会快速排序(图示讲解,附代码,通俗易懂)class Solution {public: void quick_sort(vector<int> &nums,int l,int r) { if(原创 2021-12-22 18:00:33 · 281 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值【单调队列】
剑指 Offer 59 - I. 滑动窗口的最大值题目要求给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置最大值[1 3 -1] -3 5 3 6 731 [3 -1 -3] 5 3 6 731 3 [-1 -3 5] 3 6 751 3 -1 [-原创 2021-05-06 16:47:44 · 55 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
原题链接题目要求在一个 n * m 的二维数组中,**每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。**请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,原创 2021-04-27 19:11:02 · 54 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
原题链接题目要求找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3思路while语句用来使nums[i]==nums[nums[i]](如果两者不等,就把它们交换)执行while后,如果出现nums[i]!=i,说明nums[i]就是重复数字代码cla原创 2021-04-27 18:43:27 · 55 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
原题链接题目要求用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:[“CQueue”,“deleteHead”,“appen原创 2021-04-27 11:02:24 · 55 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
原题链接题目要求实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xnx^nxn)。不得使用库函数,同时不需要考虑大数问题。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25思路指数为0的时候,返回1(递归边界)指数为-1的时候,返回倒数(原创 2021-04-26 17:16:15 · 51 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
原题链接题目要求请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例 2:输入:00000000000000000000000010000000输出:1解释:输入原创 2021-04-26 17:10:05 · 55 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数
原题链接原题链接题目要求写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注原创 2021-04-26 15:30:32 · 56 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
原题链接题目要求求 1+2+...+n1+2+...+n1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出: 6示例 2:输入: n = 9输出: 45思路11+2+...+n=n(n+1)/21+2+...+n=n(n+1)/21+2+...+n=n(n+1)/2由于不可以使用乘除法,可以考虑用sizeof运算符计算n(n+1)n(n+1)n(n+1)和使用移位运原创 2021-04-26 14:46:55 · 61 阅读 · 0 评论 -
LeetCode 73. 矩阵置零
原题链接题目要求给定一个 m∗nm * nm∗n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。进阶:一个直观的解决方案是使用 O(mn)O(mn)O(mn) 的额外空间,但这并不是一个好的解决方案。一个简单的改进方案是使用 O(m+n)O(m + n)O(m+n)的额外空间,但这仍然不是最好的解决方案。你能想出一个仅使用常量空间的解决方案吗?示例 1:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1原创 2021-04-26 14:34:22 · 82 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
题目要求写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数思路限制了不能使用加减乘除运算符,所以考虑使用位运算解决a+b得到两个结果,分别为非进位和(不带进位的和)与进位,非进位和+进位=最终结果由于非进位和+进位仍然可能得到进位,因此需要循环操作,直到进位为0为了处理负数,需要将左移操作强制类型转换为unsigned int类原创 2021-04-26 12:51:16 · 58 阅读 · 1 评论 -
剑指 Offer 57. 和为s的两个数字
题目要求输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]思路注意到数组是递增的,因此用set模拟hash表将所有元素存入hash假设存在a+b=target,则has原创 2021-04-25 22:45:40 · 45 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
题目要求输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”思路该题本质是一个排序问题,关键在于编写排序的比较函数代码class Solution {public: static bool cmp(int a,int b) { string as=to_string(a);原创 2021-04-25 22:32:13 · 48 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
题目要求输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]思路使用标准模板库中的priority_queue维护一个小根堆q,则q.top()就是最小的元素,q.pop()之后,q.top()就是次小的元素,以此类推,可得出最小的k个数pri原创 2021-04-25 22:14:47 · 61 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II
题目要求给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m−1]k[0],k[1]...k[m - 1]k[0],k[1]...k[m−1]。请问 k[0]∗k[1]∗...∗k[m−1]k[0]*k[1]*...*k[m - 1]k[0]∗k[1]∗...∗k[m−1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模原创 2021-04-25 21:53:52 · 53 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
原题链接题目要求给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m−1]k[0],k[1]...k[m-1]k[0],k[1]...k[m−1] 。请问 k[0]∗k[1]∗...∗k[m−1]k[0]*k[1]*...*k[m-1]k[0]∗k[1]∗...∗k[m−1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。(给定一原创 2021-04-25 21:35:31 · 56 阅读 · 0 评论 -
剑指 Offer 53 - II. 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思路(二分法)可以发现,该数组左边和右边满足不一样的性质:左边值==下标,右边值不等于下标,因此可以使用二分法求解该题class Solut原创 2021-04-25 21:07:04 · 44 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
原题链接题意输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]限制:1 <= target <= 10^5思路创建一个二维动态数组res,用来保存全部的答案序列创建一个一维数组ans,保存一种可原创 2021-04-25 20:29:25 · 40 阅读 · 0 评论 -
剑指 Offer 62. (约瑟夫问题)圆圈中最后剩下的数字
思路一:双向链表模拟使用list模拟(stl中的双向链表)list介绍:成员函数或成员函数模板作 用void push_front(const T & val)将 val 插入链表最前面void push_back(const T & val)将 val 插入链表最后面void pop_front()删除链表最前面的元素void sort()将链表从小到大排序void remove (const T & val)删除和 v原创 2021-04-17 22:13:11 · 52 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
题意请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路双指针算法,建立一个哈希表遍历字符串,统计出对应字符的出现次数,如果hashs[[j]]大于0,则可知i~j区间内有重复的字符,此时将i++,且hash[s[i]]–,直到以j为结尾的区间没有重复字符,然后用res保存该区间长度j-i+1代码class Solution {public:原创 2021-04-17 21:07:45 · 54 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
剑指 Offer 51. 数组中的逆序对原题链接在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000O(n2)O(n^2)O(n2)解法该做法比较简单,二重循环扫一遍即可,不做阐述O(nlogn)O(nlogn)O(nlogn)解法该解法使用了归并排序“分而治之”中“治”的部分当我们得到两个已经排序好的数组原创 2021-03-31 19:47:34 · 79 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
原题链接: 剑指 Offer 29. 顺时针打印矩阵.题目要求输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]题解算法思想:使用两个数组dx、dy标志数组遍历的方向,且对于遍历过的数原创 2021-03-26 21:15:53 · 69 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序【详细题解】
剑指 Offer 58 - I. 翻转单词顺序题目要求输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反原创 2021-03-22 15:11:18 · 146 阅读 · 0 评论