数组
文章平均质量分 59
Emperorist
患病者
展开
-
leetcode-双指针
283-移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。方法一:双指针使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。注意到以下性质:1.左指针左边均为非零数;2.右指针左边直到左指针处均为零。因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未原创 2022-04-27 08:17:10 · 286 阅读 · 0 评论 -
leetcode-图
797-所有可能的路径给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。方法一:图的深度优先搜索我们可以使用深度优先搜索的方式求出所有可能的路径。具体地,我们从 0号点出发,使用栈记录路径上的点。每次我们遍历到点 n−1,就将栈中记录的路径加入到答案中。特别地,因为本题中的图为有向无环图(DAG),搜索过原创 2022-04-05 23:24:03 · 681 阅读 · 0 评论 -
leetcode-背包问题
416-分割等和子集给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。方法一:动态规划这道题可以换一种表述:给定一个只包含正整数的非空数组 nums[0],判断是否可以从数组中选出一些数字,使得这些数字的和等于整个数组的元素和的一半。因此这个问题可以转换成「0−1 背包问题」。这道题与传统的「0−1 背包问题」的区别在于,传统的「0−1 背包问题」要求选取的物品的重量之和不能超过背包的总容量,这道题则要求选取的数字的和恰好等于整个原创 2022-04-03 09:52:40 · 1493 阅读 · 0 评论 -
算法技巧-前缀和数组
560-和为K的子数组给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。方法二:前缀和+哈希表优化我们可以基于方法一利用数据结构进行进一步的优化,我们知道方法一的瓶颈在于对每个 i,我们需要枚举所有的 j 来判断是否符合条件,这一步是否可以优化呢?答案是可以的。我们定义 pre[i] 为[0…i] 里所有数的和,则 pre[i] 可以由pre[i−1] 递推而来,即:那么[j…i] 这个子数组和为 k ,这个条件我们可以转化为简单移项可得符合条原创 2022-03-24 20:45:46 · 1108 阅读 · 0 评论 -
leetcode-字母异位词
241-有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。方法一:数组 bool isAnagram(string s, string t) { if(s.size()!=t.size()) return false; int num[128];//ASCALL码共128个 for(int i=原创 2022-03-18 10:42:40 · 941 阅读 · 0 评论 -
面试题43-1~n整数中1出现的次数
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。class Solution{public: int NumberOf1(const char*strN) { //cout << *strN << endl; if (!strN || *strN<'0' || *strN>'9' || *strN == '\0') return 0原创 2022-02-14 01:11:27 · 218 阅读 · 0 评论 -
面试题66-构建乘积数组
题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。解题思路本题的难点在于 不能使用除法 ,即需要 只用乘法 生成数组 B 。根据题目对 B[i] 的定义,可列表格,如下图所示。根据表格的主对角线(全为 1 ),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使原创 2022-02-09 00:41:01 · 108 阅读 · 0 评论 -
面试题61-扑克牌中的顺子
题目从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。解题思路我们需要做三件事情:1.对数组进行排序2.统计数组中0的个数3.统计排序之后的数组中相邻数字之间的空缺总数如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需注意一点:如果数组中的非0数字重复出现,则该数组并不是连续的。换成扑克牌的描述方法就是:如原创 2022-01-28 00:32:37 · 934 阅读 · 0 评论 -
面试题60-n个骰子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。解题思路递归算法要想求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个;另一堆有n-1个。单独的那一个有可能出现1~6的点数。我们需要计算1~6的每一种点数和剩下的n-1骰子来计算点数和。接下来把剩下的n-1个骰子仍然分我们成两堆:第一堆只有一个;第二堆有n-2个。我们把上一轮那原创 2022-01-26 00:20:16 · 162 阅读 · 0 评论 -
面试题58-翻转字符串
题目**给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:**输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。**解题思路方法一:自行编写对应的函数我们也可以不使用语言中的 API,而是自己编写对应的函数。在不同语言中,这些函数实现是不一样的,主要的差别是原创 2022-01-15 10:52:58 · 153 阅读 · 0 评论 -
leetcode-单调栈
84-柱形图中最大的矩形给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。解题思路原创 2022-01-13 15:23:23 · 179 阅读 · 0 评论 -
面试题63-股票的最大利润
题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?解题思路我们可以先定义函数diff(x)为当卖出价位数组中第i个数字时可能获得的最大利润。显然,在卖出价固定时,买入价越低获得的利润越大。也就是说如果在扫描到数组中的第i个数字时,只要我们能够记住之前的i-1个数字中的最小值,就能算出在当前价位卖出时可能得到的最大利润。C++实现class Solution {public: int maxProfit(vector<int>&a原创 2022-01-12 00:12:38 · 1265 阅读 · 0 评论 -
面试题57-和为s的数字
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。解题思路我们可以现在数组中选择两个数字,如果它们的和等于输入的s,那么我们就找到了要找的两个数字。如果和小于s,我们希望两个数字的和再大一点。由于数组已经排好序了,我们可以考虑选择较小的数字后面的数字。因为排在后面的数字要大一些,那么两个数字的和也要大一些,就有可能等于输入的数字s了。同样,当两个数字的和大于输入的数字的时候,我们可以选择较大数字前面的数字,因为排在数组前面原创 2022-01-10 23:33:30 · 179 阅读 · 0 评论 -
面试题51-数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路基于归并排序,首先要对归并排序很熟悉void Merge(int arr[], int l, int q, int r) { int n = r - l + 1;//临时数组存合并后的有序序列 int* tmp = new int[n]; int i = 0; int left = l; int right = q + 1; while (left &l原创 2022-01-02 23:19:37 · 694 阅读 · 0 评论 -
面试题49-丑数
题目把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路所谓的一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0。根据丑数的定义,丑数只能被2、3和5整除。根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。创建数组保存已经找到的丑数,用原创 2022-01-02 00:30:01 · 82 阅读 · 0 评论 -
面试题47-礼物的最大价值
题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?解题思路这是一个典型的能用动态规划解决的问题。我们先用递归的思路来分析。我们先定义第一个函数f(i,j)表示到达坐标为(i,j)的格子时能拿到的礼物总和的最大值。根据题目要求,我们有两种途径到达坐标为(i,j)的格子:通过格子(i-1,j)或者(i,j-1原创 2021-12-22 00:36:25 · 953 阅读 · 0 评论 -
面试题48-最长不含重复字符的子字符串
题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含’a’~'z’的字符。例如,在字符串“arabcacfr”中,最长的不包含重复字符的子字符串是“acfr”,长度为4。解题思路我们用动态规划算法来提高效率。首先定义函数f(i)表示以第i个字符为结尾的不包含重复字符的子字符串的最长长度。我们从左到右逐一扫描字符串中的每个字符。当我们计算以第i个字符为结尾的不包含重复字符的子字符串的最长长度f(i)时,我们已经知道f(i-1)了。如果第i个字符之前没有出原创 2021-12-21 00:10:51 · 352 阅读 · 0 评论 -
面试题46-把数字翻译字符串
题目给定一个数字,我们按照如下规则把它翻译成字符串:0翻译成“a”,1翻译成“b”,…,11翻译成“1”,25翻译成“z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。例如,12258有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”、“mzi”解题思路以12258为例,翻译12258可以分解为两个子问题:翻译1和2558,以及翻译12和258。接下来我们翻译第一个子问题中剩下的2258,同样也可以分解为两个子问题:翻译2和258,原创 2021-12-19 23:16:07 · 158 阅读 · 0 评论 -
Leetcode-贪心算法
55-跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。class Solution {public: bool canJump(vector<int>& nums) { int n=nums.size(); int farthest=0; if(n==1) return true;原创 2021-12-17 20:28:58 · 2436 阅读 · 0 评论 -
面试题45-把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路遇到这个题,全排列当然可以做,但是时间复杂度为O(n!)。在这里我们自己定义一个规则,对拼接后的字符串进行比较。排序规则如下:若ab > ba 则 a 大于 b,若ab < ba 则 a 小于 b,若ab = ba 则 a 等于 b;根据上述规则,我们需要先将数字转换成字符串再进行比较,因为需原创 2021-12-16 00:28:48 · 76 阅读 · 0 评论 -
面试题44-数字序列中某一位的数字
题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。解题思路方法1:第一种思路是:从0开始枚举每个数字。每枚举一个数字的时候,求出该数字是几位(如15是2位数、9323是4位数),并把该数字的位数和前面所有数字的位数累加。如果位数之和仍然小于等于n,则继续枚举下一个数字。当累加的数位大于n时,那么第n位数字一定在这个数字里。(此处为什么是原创 2021-12-09 23:45:36 · 94 阅读 · 0 评论 -
面试题40-最小的k个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路方法一:时间复杂度为O(n)的算法,只有当我们可以修改输入的数组时可用我们可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,则使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k个数字(这k个数不一定是排序的)。//基于Partition函数的解法voi原创 2021-12-09 00:25:15 · 94 阅读 · 0 评论 -
Leetcode-动态规划
53-最大数组和给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。解题思路方法一:动态规划假设 nums 数组的长度是 n,下标从 0 到 n−1。我们用 f(i) 代表以第 i个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:因此我们只需要求出每个位置的 f(i),然后返回 f 数组中的最大值即可。那么我们如何求 f(i) 呢?我们可以考虑 nums[i] 单独成为一段还是加入 f(i−原创 2021-12-07 14:16:56 · 1346 阅读 · 0 评论 -
面试题39-数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路方法一:基于Partition函数的时间复杂度为O(n)的算法这种算法受快速排序算法的启发。在随机快速排序算法中,我们先在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边。如果这个选中的数字的下标刚好是n/原创 2021-12-03 00:50:51 · 261 阅读 · 0 评论 -
Leetcode-回溯法
39-组合总和给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。对于给定的输入,保证和为 target 的唯一组合数少于 150 个。解题思路对于这类寻找所有可行解的题,我们都可以尝试用「搜索回溯」的方法来解决。回到本题,我们定义递归函数 dfs(target, combine,原创 2021-11-29 23:12:58 · 230 阅读 · 0 评论 -
面试题29-顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:则依次打印出数组:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。解题思路我们不用vector,就是二维数组。当我们遇到一个复杂问题的时候,可以用图形来帮助思考。由于是从外圈到内圈的顺序依次打印的,所以我们可以把矩阵想象成若干个圆。我们可以用一个循环来打印矩阵,每次打印矩阵中的一个圆。假设这个矩阵的行数rows,列数是columns。打印第一圈的左上角的坐标是(0,0),第二圈原创 2021-11-25 23:58:38 · 289 阅读 · 0 评论 -
面试题3-数组中重复的数字
题目:找出数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路可以把当前序列a[ ] 当成是一个下标和下标对应值是相同的数组(时间复杂度为O(n),空间复杂度为O(1));遍历数组,判断当前下标的值和下标是否相等:若相等,则遍历下一位;若不等,则将当前位置i上原创 2021-10-02 22:28:23 · 79 阅读 · 0 评论 -
Leetcode热题Hot100+Top面试题-数组
题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target原创 2021-10-20 17:12:27 · 4379 阅读 · 0 评论 -
面试题21-调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。解题思路创建双向队列,遍历数组,奇数前插入,偶数后插入。最后使用assign方法实现不同容器但相容的类型赋值。C++实现class Solution {public: void reOrderArray(vector<int> &array) { deque<int> result; int num =原创 2021-11-03 22:59:55 · 370 阅读 · 0 评论