![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
从零开始学习的ZHL
已工作但很弱鸡的学习者
展开
-
leetcode 922. 按奇偶排序数组 II
方法1:我先想的是遍历一遍数组,在遍历时,把奇数放到一个数组,把偶数放到另一个数组。然后再重新遍历一遍,这次遍历时,下标是奇数就从奇数数组依次取数据,下标是偶数就从偶数数组取数据。耗时40 msclass Solution {public: vector<int> sortArrayByParityII(vector<int>& A) { int length = A.size(); vector<int> o原创 2020-11-03 21:40:23 · 218 阅读 · 0 评论 -
leetcode 1232. 缀点成线
这道题的思路就是求斜率。斜率不同的话就不是同一直线。要注意的是求斜率时,k是double类型的所以在做除法时加上 "1.0",我就是忘了这一点,检查了很久白白浪费了很多时间。耗时20msclass Solution {public: bool checkStraightLine(vector<vector<int>>& coordinates) { if(coordinates.size() == 2) return原创 2020-11-02 21:25:50 · 185 阅读 · 0 评论 -
leetcode 1539. 第 k 个缺失的正整数
我先想的是把已经有的所有数放到set里面,然后从1开始,如果不能在set里找到当前的数,k就减1。用时32msclass Solution {public: int findKthPositive(vector<int>& arr, int k) { set<int> existing(arr.begin(),arr.end()); int i = 0; while(k) {原创 2020-10-28 21:38:07 · 296 阅读 · 0 评论 -
leetcode 747. 至少是其他数字两倍的最大数
在看题目的示例2时,给了我启发,要想一个数是其他所有数的2倍以上,那它只需要是第2大的数两倍以上。所以就变成了遍历一遍数组,找出其中的最大数和第2大的数,然后比较是不是2倍。用时0msclass Solution {public: int dominantIndex(vector<int>& nums) { if(nums.size() == 1) return 0; int max1 = IN原创 2020-10-28 20:23:11 · 162 阅读 · 0 评论 -
leetcode 1266. 访问所有点的最小时间
这道题我刚开始还分情况讨论,尝试去根据两个点的正负号讨论,所以开始代码写的很丑,但最后发现都可以归纳为一种情况。两个点的距离 = max( abs(x0-x1), abs(y0-y1) );用了12msclass Solution {public: int minTimeToVisitAllPoints(vector<vector<int>>& points) { if(points.size() == 1) .原创 2020-10-26 20:58:22 · 99 阅读 · 0 评论 -
leetcode 1160. 拼写单词
先把“字母表”的字母统计保存在map里然后遍历每个字符串。用了一个字符,就在map里把这个字母个数减1,不管该字符串能不能遍历完,都要在map里把字母个数加回去。以便遍历下一个字符串时用。耗时132msclass Solution {public: int countCharacters(vector<string>& words, string chars) { map<char,int> char_table;//<字母,字母原创 2020-10-24 11:05:38 · 79 阅读 · 0 评论 -
leetcode 1331. 数组序号转换
用的比较笨的方法,耗时也长 488ms。class Solution {public: vector<int> arrayRankTransform(vector<int>& arr) { vector<int> a;//保存没有重复元素的数组 map<int,int> b;//帮助去重复元素,<arr[i],个数> for(int i =0;i<arr.size();+原创 2020-10-24 10:27:42 · 153 阅读 · 0 评论 -
leetcode 1534. 统计好三元组
这道题我只会三重循环的方法。如果 i 和 j 的条件满足,k从j+1开始找是否有满足条件的。用了68msclass Solution {public: int countGoodTriplets(vector<int>& arr, int a, int b, int c) { int cnt = 0; for(int i =0;i<arr.size();++i) { for(int j =i原创 2020-10-22 21:30:06 · 153 阅读 · 0 评论 -
leetcode 605. 种花问题
我的想法是,如果第i个花坛的左右都是空的话,在这个花坛就种下花,即,flowerbed[i]=1并且n--,表示种下了一朵。然后遍历完整个数组后,判断n朵花是不是都种完了。在这里要注意边界,边界只需要判断它的一侧是不是可以种花。然后还有特殊情况是只有一个花坛时,所以我又把它单独拎出来判断。这道题我的代码用时48ms,而且也写的真的很丑 - -class Solution {public: bool canPlaceFlowers(vector<int>& flo.原创 2020-10-21 21:30:44 · 123 阅读 · 0 评论 -
leetcode 219. 存在重复元素 II
这道题我首先是用的暴力法,超时。下面这个方法是用个map保存 数和它的下标。这个方法通过了,但是用时需要106msclass Solution {public: bool containsNearbyDuplicate(vector<int>& nums, int k) { map<int,int> mapIndex;//<数值,下标> for(int i = 0 ;i<nums.size() ;i++)原创 2020-10-20 21:21:46 · 108 阅读 · 0 评论 -
leetcode 628. 三个数的最大乘积
我在草稿纸上列举了一些有正数有负数的数组,列了多种情况,然后找规律发现,三个数的最大乘积的情况是两种:1.三个最大的数相乘;2.两个最小的数乘1个最大的数。所以主要要做的就是循环数组一遍,找出其中最大的3个数,以及最小的两个数。class Solution {public: int maximumProduct(vector<int>& nums) { if(nums.size() == 3) return nums[0]*num原创 2020-10-18 11:37:29 · 87 阅读 · 0 评论 -
leetcode 977. 有序数组的平方
第一种方法:比较暴力。把负数取绝对值变成正数,然后排序,再挨个平方。class Solution {public: vector<int> sortedSquares(vector<int>& A) { for(int i =0;i<A.size();++i) { if(A[i]<0) { A[i] = -A[i];原创 2020-10-18 10:38:35 · 86 阅读 · 0 评论 -
leetcode 1588. 所有奇数长度子数组的和
我通过的代码在耗时和内存消耗上并不是很优的,记录一下我这比较笨的人的通过的相对好理解的代码class Solution {public: int sumOddLengthSubarrays(vector<int>& arr) { int sum = 0; int tmp_sub_arr_sum; int start,end; for(start = 0;start<arr.size();++start原创 2020-10-17 11:34:05 · 126 阅读 · 0 评论 -
搜索范围
还是用二分查找,增加限制条件:查找区间左端点时,当target == nums[mid]时,如果mid == 0 || nums[mid-1]<target,说明mid就是区间的左端点否则,设置要查找的区间右端点mid-1查找区间右端点时,当target == nums[mid]时,如果mid == nums.size()-1 || nums[mid+1]>target,说明mid就是...原创 2018-06-20 16:28:11 · 312 阅读 · 0 评论 -
单词接龙2
和上一个单词接龙不一样在,这道题返回所有的最短路径记录搜索路径的宽搜:1.将普通队列更换为vector,保存所有的搜索结点,在pop时不会丢弃队头元素,只是移动front指针2.在队列结点中增加该结点的前驱结点在队列中的下标信息,可通过该下标找到是从队列中的哪个结点搜索到当前结点的多条路径的保存:到达某一位置可能存在多条路径,使用映射记录到达每个位置的最短需要步数,新拓展到的位置只要未曾到达或到达...原创 2018-06-27 18:46:43 · 1710 阅读 · 0 评论 -
火柴拼正方形
想象正方形的4条边是4个桶,将每个火柴棍回溯放置在每个桶中,放完N个后,检查4个桶中的长度和是否相同优化剪枝:1.N个火柴棍的总和对4取余是不是0,不是的话返回假2.长度按照从大到小排序,先尝试长的,减少回溯的可能3.每次放置时,每条边上不可放置超过总和1/4长度的火柴棍class Solution {public: bool makesquare(vector<int>&a...原创 2018-06-27 20:39:02 · 1858 阅读 · 0 评论 -
实现 Trie (前缀树)
#define TRIE_MAX_CHAR_NUM 26struct TrieNode{ TrieNode* child[TRIE_MAX_CHAR_NUM]; bool is_end; TrieNode() :is_end(false){ for(int i = 0; i < TRIE_MAX_CHAR_NUM; ++i) child[i] = 0; }};cla...原创 2018-07-03 16:24:52 · 163 阅读 · 0 评论 -
添加与搜索单词——数据结构设计
添加时一样,搜索不一样。深度搜索Trie树node为正在搜索的节点,word指向正在搜索的单词起始,查找成功返回真;否则返回假; 当遍历到单词结束时(word指向’\0’): 如果node指向的结点标记为单词的结尾(is_end为真) 返回真 否则返回假如果word指向 ’.’: 遍历node的全部孩子指针: ...原创 2018-07-03 16:54:19 · 531 阅读 · 0 评论 -
朋友圈
方法1,图的深度优先搜索该问题即求,图中有多少个区域是相连的,可以使用图的深搜或广搜class Solution {public: void DFS(int i,vector<vector<int> >& graph,vector<int>& visit) { visit[i] = 1; for(...原创 2018-07-03 22:20:17 · 245 阅读 · 0 评论 -
搜索插入位置
利用二分查找。注意边界条件,和插入时的条件class Solution {public: int searchInsert(vector<int>& nums, int target) { int begin = 0; int end = nums.size()-1; int index = -1;//插入的位置 ...原创 2018-06-20 15:46:22 · 87 阅读 · 0 评论 -
单词接龙
单词与单词之间的转换,可以理解为一张图,图的顶点是单词,若两单词之间可以互相转换,则这两个单词所代表的顶点间有一条边,求图中结点beginword到endWord的所有路径中,最少包括多少个结点。图的宽度优先搜索使用map构造邻接表表示的图,map<string,vector<string> >,遍历wordList,对任意两个单词,若wordList[i],wordLis...原创 2018-06-26 22:17:07 · 737 阅读 · 0 评论 -
岛屿的个数
用一个mark数组,和grid对应,初始化为0DFS:1.标记当前搜索位置已被搜索(标记当前位置的mark数组为1)2.按照方向数组的4个方向,拓展4个新位置newx,newy3.若新位置不在地图范围内,则忽略4.如果新位置未曾到达(mark[newx][newy]=0,)且是陆地(grid[newx][newy]=1),继续DFS这个位置BFS:1.设置搜索队列Q,标记mark[x][y]=1,...原创 2018-06-26 20:33:25 · 384 阅读 · 0 评论 -
最小覆盖子串
1.设置两个字符哈希数组,map_s,代表当前处理的窗口区间中的字符数量,map_t,代表子串t的字符数量2.设置两个指针(begin, i)指向字符串第一个字符3.i指针向后逐个扫描字符串中的字符,在这过程中,循环检查begin指针是否可以向前移动:如果当前begin指向的字符,在t中没有出现,直接向前移动begin,如果当前begin指向的字符,在t中出现了,但是当前区间窗口中的该字符数量足够...原创 2018-06-26 19:03:32 · 142 阅读 · 0 评论 -
地下城游戏
需要思考是从左上角向右下角推,还是从右下向左上推。还有dp[i][j]代表什么?如果从左上向右下推,得到的结果是骑士积累了多少血量,无法转换成“初始至少多少血”从右下向左上推,dp[i][j]代表若要到达右下角,至少需要多少血若地牢是n*m的,i代表行,从n-2至0: j代表列,从m-2至0: 设dp_min = min(dp[i+1][j], dp[i][j+1]); ...原创 2018-07-01 17:36:11 · 187 阅读 · 0 评论 -
最小路径和
设dp[i][j]是到达位置(i,j)时的最优解class Solution {public: int minPathSum(vector<vector<int>>& grid) { if(grid.size() == 0) return 0; int row = grid.size...原创 2018-07-01 16:40:44 · 180 阅读 · 0 评论 -
重复的DNA序列
方法一:枚举所有长度为10的子串,插入到哈希表中,记录数量。遍历哈希表,存储出现次数超过1次的子串。复杂度O(N)class Solution {public: vector<string> findRepeatedDnaSequences(string s) { map<string,int> word_map;//<子串,子串数量>...原创 2018-06-26 16:18:15 · 2071 阅读 · 0 评论 -
课程表
设N个课程,有M个依赖关系,可以看成顶点个数为N,边个数为M的有向图如果,有向图无环,则可以完成全部课程,有环就不能。问题转化成:构建一个图,判断是否有环方法1:深度优先搜索在深度优先搜索时,如果正在搜索某一顶点(还未退出该顶点的递归搜索),又回到了该顶点,证明图有环 struct GraphNode{ int label; vector<GraphNo...原创 2018-06-19 17:24:50 · 318 阅读 · 0 评论 -
二叉树中的最大路径和
递归。递归时,将每个结点作为一个根结点传入递归函数。对于当前的这个结点,以它为根结点,计算它左子树路径的最大和,右子树路径的最大和。通过这个结点,当前是看做是以它根结点,这个结点的最大路径和就是:左子树最大路径和(大于0的话)+右子树最大路径和(大于0的haul)+根结点的值。然后更新当前计算的MAX是多少,也就是我们的结果。递归函数的返回值是:当前这个结点的左子树最大路径和,或者是右子树最大路径...原创 2018-07-10 18:45:51 · 257 阅读 · 0 评论 -
接雨水2
1.能积水的底面一定不在四周,积水多少与周围最矮的立方体有关2.围住中间积水的边界位置不一定在四周,所以“找出四周边界上最低的点直接求差”不可行思路:1.搜索队列使用优先级队列(堆),越低矮的点优先级越高(最小堆),越优先搜索2.以矩形四周的点作为起始点(想象这个问题是水池外面有水,然后水面一点点升高,然后就会从水池高度低的地方向水池里面灌水,导致水池形成积水,积水处的水面就也会升高)进行广度优先...原创 2018-06-28 16:39:25 · 734 阅读 · 3 评论 -
2.两数相加
挨个相加,记录下进位/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; *///将两个链表从第一个节点开始相加,直到2个链表都为...原创 2018-06-12 20:40:56 · 92 阅读 · 0 评论 -
28.实现strStr()
class Solution {public: int strStr(string haystack, string needle) { //用KMP算法,KMP的具体过程已写在博客 //大致来说,首先是得到这个字符串的前缀表 //然后把前缀表后移,处理成前缀表第一个元素是-1 //再KMP if(ne...原创 2018-09-13 16:52:19 · 254 阅读 · 0 评论 -
21.合并两个有序链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode*...原创 2018-09-13 16:50:58 · 140 阅读 · 0 评论 -
7.反转整数
class Solution {public: int reverse(int x) { //将每一位保存进数组中,然后挨个乘以10的对应次方,求和加起来就行 //注意负数, -123%10 = -3,所以保存在数组中的数是【-3,-2,-1】 //-3*10^2 + -2 * 10^1 + -1 = -321,就得到了结果 ...原创 2018-09-13 16:43:57 · 137 阅读 · 0 评论 -
746使用最小花费爬楼梯
class Solution {public: int minCostClimbingStairs(vector<int>& cost) { //动态规划,确定好状态,dp[i]表示跳到i阶花的代价 //所以最后爬完楼梯花费代价是dp[n],注意不是n-1,因为需要爬完整个楼梯 //状态转移方程:dp[i] ...原创 2018-09-10 20:19:07 · 250 阅读 · 0 评论 -
1.两数之和
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { //用一个map<int,int>保存<数,下标> //对于每个nums[i],在map里找有没有和他加起来等于target的数 ...原创 2018-09-10 19:21:20 · 156 阅读 · 0 评论 -
单词拆分
动态规划。1.确定状态,dp[i]表示str[0...i]是否可以拆分2.状态转移,j位于0~i-1之间,如果dp[j]为真,检查str[j...i]是否在字典中3.边界,dp[0]为true0 1 2 3 4 5 6 7 8 l e e t c o d eclass Solution {public: bool wordBreak(string s, vector<stri...原创 2018-07-05 20:09:21 · 715 阅读 · 0 评论 -
9.回文数
class Solution {public: bool isPalindrome(int x) { //如果是负数,直接返回false //如果是0,肯定true //否则,就从后往前依次取每一位,重新组成新的数,比较是否相等 if(x<0) return false; ...原创 2018-09-13 16:48:34 · 146 阅读 · 0 评论 -
不同路径
用深度搜索会超时:class Solution {public: void DFS(int m,int n,int& road,int x,int y) { static const int dx[] = {1, 0}; static const int dy[] = {0, 1}; fo...原创 2018-07-23 18:41:29 · 155 阅读 · 0 评论 -
5.最长回文子串
用动态规划。状态:dp[i][j] 表示字符串的【i,j】范围内的子串是否是回文串,是的话就为1,否则为0状态转移方程:如果i = j,那么就是一个字符,肯定为1;如果 j = i+1,说明是相邻两个字符,只需判断s[i]==s[j];如果j>i+1,除了看s[i]=s[j]之外,还要看去掉头尾的dp[i+1][j-1]部分是不是回文串。所以:class Solut...原创 2018-07-23 16:58:10 · 106 阅读 · 0 评论 -
区域和检索 - 数组可修改
class NumArray {public: void build_segment_tree(vector<int>& value, vector<int>& nums, int pos, int left, int right){ if(left == right) { value[pos] = nums[left]; retur...原创 2018-07-04 18:35:19 · 297 阅读 · 0 评论