04 2020 档案
摘要:编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 True ;不是,则返回 Fa
阅读全文
摘要:给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。如果不存在这样的下标 index,就请返回 -1。何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:首先,A.length >= 3其次,在 0 A[i+1] > ... > A[A.length - 1] 你将 不能直接...
阅读全文
摘要:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2] 限制:2 singleNumbers(vector& nums)...
阅读全文
摘要:本题我使用优先队列进行解决,每次拿出一个最小的元素即可,注意在push元素时,检查链表指针是否为空: struct Ele { int val; ListNode *ptr; bool operator r.val; } }; ListNode* mergeKLists(vector& lists) { ...
阅读全文
摘要:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5在该题目中,可以采用分治的思想去求逆序对,如果一个元素比较大,那么他会比右侧的很多数都大,这样的话,我们可以直接统计他到底比右侧哪些数大,采用这种想法,我们可以使用归并排序对这个数组进行排序,并且在归并的过程中,直接统计左侧每一个...
阅读全文
摘要:该题目是一道很坑的模拟题,题目描述如下所示:请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有...
阅读全文
摘要:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 rightSideView(TreeNode* root) { vector ans; if(root==NULL) return ans; stack> ...
阅读全文
摘要:给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中「优美子数组」的数目。在这道题目中,我首先想到的方法是将奇数数组的下标保留下来,之后根据乘法原理计算有多少个优美子数组即可,我的程序代码如下:#include #include using namespace std;int numberOfSubarray...
阅读全文
摘要:给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。看到该题我选择的方式为广度优先搜索(bfs),遍历每一个为1的点,然后从该点广度优先搜索,搜索到几个集合就代表有几个岛屿。程序代码如下:int numIslands(vector>& grid...
阅读全文
摘要:由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n]。例如,["abc",3]=“abcabcabc”。如果我们可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。例如,根据定义,"abc" 可以从 “abdbec” 获得,但不能从 “acbbe” 获得。现在给你两个非空字符串 s1 和 s2(每个最多 100 个字符长)和两个整数 0 ≤ n1...
阅读全文
摘要:题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。在该题中,不能到达最后一个位置的原因只有中间出现了0,然而0前面的元素无法跨过0,这样便不能到达最后一个位置,因此我们就寻找这样的情况,需要注意的是,如果最后一个元素是0,那我们不需要跨过这个0,只需要到达这个0即可,程序代码如下:bool canJump(...
阅读全文
摘要:给出一个数组,每个元素是一个区间,题目要求将重叠的区间进行合并,首先我们根据区间的左顶点值进行排序,排序之后的区间,需要合并的一定相邻,在看完标准答案之后,我学会了对vectorback元素直接进行修改,程序代码如下,这里排序我使用了快速排序:void quicksort(int left, int right, vector& intervals){ if(left >= right) ...
阅读全文
摘要:该题目首先我想到的算法是bfs,但是bfs的空间复杂度较高,需要额外的队列,在看完题解之后,发现了动态规划这个好办法。具体程序代码如下: vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { int m = matrix.si
阅读全文
摘要:题目要求:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 今天的题目是一道模拟题,直接对目标情况进行模拟即可,虽然是两层循环嵌套,但是实际时间复杂度为O(n)。代码如下: #include <cstdio> #include <iostream> #include <str
阅读全文
摘要:本题我采用从不同中心不断扩展的方法去进行求解,程序代码如下,在写程序的时候我遇到的一个坑是,由于string的length()函数返回值并非int型数值,因此一开始直接使用min()函数会报错,经过强制类型转换后便可以不报错。时间复杂度为O(n)马拉车算法留作以后再进行学习~~~~~ #includ
阅读全文
摘要:一道很简单的水题,不过没有想到O(1)时间复杂度的方法,代码如下: #include <cstdio> #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std;
阅读全文
摘要:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 看到该题目我首先的想法是采用递推的方式去实现该题目,但是发现会生成重复的元素,因此我采用了dfs剪去不合适的分支的方法来处理该题目。需要剪枝的情况有三种,左括号数目大于n,右括号数目大于n,左括号数目小于
阅读全文
摘要:该题目如果使用时间复杂度为O(m+n)的算法则会非常简单,今天我们在这里介绍一个时间复杂度为O(log(m+n))的算法。 我们这里采用二分法的思想去解决这道题目,首先我们给出的数组是两个有序数组,这样的话,我们可以很方便的将两个数组各自分为两个部分,而我们要寻找的中位数只需要将两个数组合并后的数组
阅读全文
摘要:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
阅读全文
摘要:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 ->
阅读全文
摘要:本道题目我起初的想法是暴力寻找两个数之和,每次与目标数进行比对,这样的时间复杂度是O(n2)。 改进: 我使用散列表将数组元素散列存储,这样便可以对元素进行O(1)访问,从而实现在O(n)的时间复杂度解决该问题。 #include <iostream> #include <cstdio> #incl
阅读全文

浙公网安备 33010602011771号