力扣算法题
C++有点难
记录,总结
展开
-
2020-11-13每天一刷
力扣 328 奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2->1->3->5-&原创 2020-11-13 11:53:04 · 166 阅读 · 0 评论 -
2020-11-04每天一刷
力扣200 岛屿的数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [[“1”,“1”,“1”,“1”,“0”],[“1”,“1”,“0”,“1”,“0”],[“1”,“1”,“0”,“0”,“0”],[“0”,“0”,“0”,“0”,“0”]]输出:1示例 2:输入:grid = [[“1原创 2020-11-05 10:07:25 · 245 阅读 · 0 评论 -
2020-11-03每天一刷
力扣187 重复的DNA序列所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。示例 1:输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”输出:[“AAAAACCCCC”,“CCCCCAAAAA”]示例 2:输入:s = “AAA原创 2020-11-03 12:48:59 · 173 阅读 · 0 评论 -
2020-11-02每天一刷
力扣209 单词的规律给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = “abba”, str = “dog cat cat dog”输出: true示例 2:输入:pattern = “abba”, str = “dog cat cat fish”输出: false示例 3:输入: pat原创 2020-11-02 14:36:47 · 168 阅读 · 0 评论 -
2020-10-31每天一刷
字符哈希用来统计一个字符串中,每个字符的个数。#include "util.h"using namespace std;int main(){ int char_map[128] = {0}; string str = "abcdefgaaxxy"; for (int i = 0; i < str.length(); ++i) { char_map[str[i]]++; } for (int i = 0; i < 128; ++i原创 2020-10-31 12:19:19 · 134 阅读 · 0 评论 -
2020-10-30每天一刷
力扣33 搜索旋转排序数组给你一个升序排列的整数数组 nums ,和一个整数 target 。假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。示例 1:输入:nums = [4,5,6,7,0,1,2], target = 0输出:4示例 2:输入:nums = [4,5,6,7,0,1,2], tar原创 2020-10-30 14:22:41 · 229 阅读 · 0 评论 -
2020-10-29每天一刷
二分查找的实现方式递归://二分查找递归实现,查找的区间都是闭区间bool binary_search(vector<int>& sort_array,int begin,int end, int target){ if (begin > end ){ return false; } int mid = begin + (end - begin)/2; if(target == sort_array[mid]){原创 2020-10-29 15:03:28 · 166 阅读 · 0 评论 -
2020-10-28每天一刷
力扣199二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <—/ 2 3 <—\ 5 4 <—来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-right-side-v原创 2020-10-28 17:21:23 · 205 阅读 · 0 评论 -
2020-10-26每天一刷
力扣315给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入:nums = [5,2,6,1]输出:[2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1)2 的右侧仅有 1 个更小的元素 (1)6 的右侧有 1 个更小的元素 (1)1 的右侧有 0 个更小的元素提示:0 <= nums.length <= 10^5-原创 2020-10-26 21:56:12 · 171 阅读 · 0 评论 -
2020-10-24每天一刷
剑指60 骰子的点数把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例 2:输入: 2输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0原创 2020-10-24 10:25:41 · 155 阅读 · 0 评论 -
2020-10-23每天一刷
假设有两组括号,列出它所有组合的可能思路:用递归的形式,列出所有可能的情况#include "util.h"using namespace std;void mygenerate(string item, int n, vector<string>& result){ if (item.size() == 2*n){//当字符串的长度为2n的时候结束递归 result.push_back(item); return; } m原创 2020-10-23 10:43:21 · 163 阅读 · 0 评论 -
2020-10-22每天一刷
力扣90给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/subsets-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路:本题和之前题的区别在于,原集合中的元素是重复的,结果要求和之前的题原创 2020-10-22 17:30:56 · 142 阅读 · 0 评论 -
2020-10-21刷题
将一个链表的值插入vector,用递归实现#include "util.h"using namespace std;//定义链表的节点struct Listnode{ int val; Listnode* next; Listnode(int x):val(x),next(nullptr){//列表初始化 }};void add_to_vector(Listnode* head, vector<int>& vec){ if (!head原创 2020-10-21 20:19:41 · 301 阅读 · 0 评论 -
剑指offer--矩阵中的路径
力扣 79思路:DFS + 回溯代码:#include<bits/stdc++.h>using namespace std;int directs[4][2] ={{1,0},{-1,0},{0,-1},{0,1}};class Solution{public: bool dfs(vector<vector<char>>& board,string& word,vector<vector<bool>>&原创 2020-08-22 11:32:37 · 116 阅读 · 0 评论 -
每天一刷0817
力扣 数值的整数次方实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25说明:-100.0 < x < 100.0n原创 2020-08-17 14:23:07 · 142 阅读 · 0 评论 -
2021秋招网易笔试
力扣214 最短回文串给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例 1:输入: “aacecaaa”输出: “aaacecaaa”示例 2:输入: “abcd”输出: “dcbabcd”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shortest-palindrome著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路:把要处理的字符分成原创 2020-08-09 11:25:07 · 257 阅读 · 0 评论 -
算法营day17--回溯
力扣 200 岛屿的数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:[[‘1’,‘1’,‘1’,‘1’,‘0’],[‘1’,‘1’,‘0’,‘1’,‘0’],[‘1’,‘1’,‘0’,‘0’,‘0’],[‘0’,‘0’,‘0’,‘0’,‘0’]]输出: 1示例 2:输入:[[‘1’,‘1’,‘0’,‘0原创 2020-08-05 16:56:37 · 168 阅读 · 0 评论 -
算法营day16--贪心+回溯
活动选择有n个需要在同一天使用同一个教室的活动a1, a2, …, an,教室同一时刻只能由一个活动使用。每个活动a[i]都有一个开始时间s[i]和结束时间f[i]。一旦被选择后,活动a[i]就占据半开时间区间[s[i],f[i])。如果[s[i],f[i])和[s[j],f[j])互不重叠,a[i]和a[j]两个活动就可以被安排在这一天。求使得尽量多的活动能不冲突的举行的最大数量。思路:将所有的活动按结束时间升序排序,每次选择最早结束的活动,这样才能使一天中不重叠举办的活动次数最多代码:#inc原创 2020-08-04 17:17:37 · 138 阅读 · 0 评论 -
算法营day15--贪心算法
选择排序思路:选择排序也是一种贪心算法,每次选择当前未排序数组中的最小值,和未排序数组的头进行交换。代码:void mysel_sort(vector<int> &nums){ for (int i = 0; i < nums.size()-1; ++i) { int smallest = i; for(int j = i+1;j<nums.size();++j) { if(nums[j]原创 2020-08-03 10:51:47 · 143 阅读 · 0 评论 -
算法营day14--动态规划
牛客 distinct-subsequences题目描述给定两个字符串S和T,返回S子序列等于T的不同子序列个数有多少个?字符串的子序列是由原来的字符串删除一些字符(也可以不删除)在不改变相对位置的情况下的剩余字符(例如,"ACE"is a subsequence of"ABCDE"但是"AEC"不是)例如:S =“rabbbit”, T =“rabbit”返回3代码:import java.util.*; public class Solution { /** *原创 2020-08-02 21:14:42 · 137 阅读 · 0 评论 -
算法营day13--动态规划
牛客 palindrome-partitioning-ii题目描述给出一个字符串s,分割s使得分割出的每一个子串都是回文串计算将字符串s分割成回文分割结果的最小切割数例如:给定字符串s=“aab”,返回1,因为回文分割结果[“aa”,“b”]是切割一次生成的。思路:代码:用DP判断是否是回文字串class Solution {public: /** * * @param s string字符串 * @return int整型 */原创 2020-08-01 15:12:19 · 92 阅读 · 0 评论 -
算法营day12--动态规划
牛客 unique-paths题目描述一个机器人在m×n大小的地图的左上角(起点,下图中的标记“start"的位置)。机器人每次向下或向右移动。机器人要到达地图的右下角。(终点,下图中的标记“Finish"的位置)。可以有多少种不同的路径从起点走到终点?备注:m和n小于等于100思路:代码:class Solution {public: /** * * @param m int整型 * @param n int整型 * @return原创 2020-07-31 14:37:53 · 395 阅读 · 0 评论 -
算法营day11--动态规划
牛客 word-break题目描述给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。例如:给定s=“leetcode”;dict=[“leet”, “code”].返回true,因为"leetcode"可以被分割成"leet code".思路:见上图。代码:class Solution {public: bool wordBreak(string s, unordered_s.原创 2020-07-30 12:09:12 · 120 阅读 · 0 评论 -
算法营day10
牛客 二叉搜索树的第k个节点题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4思路:BST树 的特点,其中序遍历得到的序列是升序的,我们只要非递归遍历BST树,并取第k个就可以了代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2020-07-29 17:05:22 · 113 阅读 · 0 评论 -
算法营day9
牛客 数组中只出现一次的数字题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:如果一个数组中,只有一个数字出现一次的话,求这个数的?将序列中的所有数字异或,因为相同的数字异或会为0,一个不为0的数字异或还是这个数字本身。这个题可以转换为上述的题,将序列中的所有数字异或,最后得到的的数,是这两个不同的数字的异或,用序列中的每个数和得到的这个数求&运算,根据等不等于0将数组分成两组。代码:class Solution {public原创 2020-07-28 21:41:08 · 90 阅读 · 0 评论 -
2021阿里巴巴校招笔试题
题目:小明和小强在玩游戏,现在有一个非递减的数字序列,然后依次进行以下步骤(小强先开始):每个人选择一个当前序列中的数字,把这个数字在序列中第一次出现的位置及其左边的数字全部删除,当某人操作完之后序列为空时则此人获胜。例如:此时的序列是111222,如果小强选择2,那么删除之后得到的序列是22。假设小明和小强都是大佬,请问最后谁能获得游戏胜利?输入描述:第一行表示的测例数对于每组数据,第一行一个整数n,n表示序列中数字的个数。接下来一行n个整数,其中a[i]表示第i个整数。输出描述:对于每组原创 2020-07-27 21:26:33 · 4958 阅读 · 4 评论 -
算法营day8
牛客 回文数索引题目描述给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。思路:回文数字就是从前读和从后读,所得到的顺序是一样的。判断字符串,已经是回文的话,那么直接输出-1不是回文的话,去掉end,再检测。是回文的话,输出end否则输出beginPS:这个题目还是不好理解代码:#include<iostream>#include<string>原创 2020-07-27 19:04:19 · 86 阅读 · 1 评论 -
算法营day7
牛客 最小的k个数题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:1.排序取最小的k个数2.使用优先队列,就是小根堆。维护一个个数为4的小根堆,最后将这个堆完全输出代码:class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector原创 2020-07-26 14:21:19 · 83 阅读 · 0 评论 -
算法营day6
牛客 二叉树中和为某一值的路径题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:DFS回溯算法。回溯算法本质是一个基于DFS的穷举过程往待选结果添加值待选结果是否符合条件 是:添加结果集 (剪枝)DFS 深度优先回退 检测下一个代码:牛客思路:代码:牛客思路:代码:牛客思路:代码:...原创 2020-07-25 12:16:14 · 110 阅读 · 0 评论 -
算法营day5
牛客 删除链表中的重复节点题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:定义两个指针prev和last,比较last和last->next的值,不相等的话prev++ last++如果两个值相等的话,那么只让last++pre->next = last->nextPS:在访问链表的时候,要注原创 2020-07-24 18:43:11 · 116 阅读 · 2 评论 -
2021华为秋招软件开发笔试题
题目:学校有一个在线学习系统,没门课程由N个页面组成(0< N<= 10000)个页面组成,学生从第一页开始按顺序学到最后一页提交学习记录。系统会记录每页停留的时间(单位秒),当学生提交时会分析时间是否满足要求,分析规则如下:每分钟(60秒)之内学完的页面不能大于4页。例如系统记录到某学生页面停留时间如下:10 120 10 20 10 10 50该学生第一分钟学完1页,第二分钟学完0页,第三分钟学完5页,第四分钟学完1页,则判定为不满足要求。输入描述:输入数据包含多个学生的提交原创 2020-07-23 18:47:50 · 3364 阅读 · 2 评论 -
算法营day4
牛客 反转链表思路1:链表的长度总共有n项,假设第k+1到n项都反转完毕了,只需要更改第k+1的指针,让他指向第k项,然后让第k项指向空。代码1:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) {原创 2020-07-23 17:24:19 · 93 阅读 · 0 评论 -
算法营day3
牛客 菲波那切数列题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39思路:递归解法:效率低,重复计算和函数调用耗费多。迭代解法代码://这就是一份Dp的代码,迭代class Solution {public: int Fibonacci(int n) {//f(n-2) + f(n-1) = f(n) if(0 == n){ return n;原创 2020-07-22 12:44:30 · 106 阅读 · 0 评论 -
算法营day2
牛客 替换空格题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:用双指针的办法,一个指针指向原来字符尾’\0’处,另一个指向替换完成之后新的字符尾处,代码:class Solution {public: void replaceSpace(char *str,int length) { if(str == nullptr || length <=0)原创 2020-07-21 16:20:38 · 92 阅读 · 0 评论 -
20200413刷题总结
已知二叉树的前序遍历和中序遍历,构造二叉树已知二叉树的后序遍历和中序遍历,构造二叉树1思路,必须要有中序遍历,这样才能区分二叉树的左右子树。前序遍历的头是根节点,在中序遍历中找到根节点的位置,划分左右子树。然后在找左右子树的根节点,递归完成/*** Definition for a binary tree node.* struct TreeNode {* int val;...原创 2020-04-13 15:05:14 · 125 阅读 · 0 评论 -
算法营day1
牛客 二维数组中的查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路1:两个for循环,遍历二维数组,然后判断target是否在二维数组中。不推荐思路2:充分考虑到该二维数组的特点,每一行是升序的,每一列也是升序的。通过target和矩阵右上角的元素进行比较target<该元素,则target不可能在这一列,那么–j,排除掉这一列原创 2020-07-20 16:51:25 · 105 阅读 · 0 评论 -
每天一刷20200718
力扣98题 给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。来源:力扣(LeetCode)链接:h原创 2020-07-18 15:32:43 · 83 阅读 · 0 评论 -
每天一刷20200717
力扣15题 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum著作权归领原创 2020-07-17 15:53:47 · 134 阅读 · 0 评论 -
每天一刷20200705
问题题目描述计算最少出列多少位同学,使得剩下的同学排成合唱队形说明:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<…<Ti-1Ti+1>…>TK。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。注原创 2020-07-05 10:54:56 · 99 阅读 · 0 评论 -
每天一刷20200701
今天7.1号也要加油哦问题题目描述实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。注意每个输入文件有多组输入,即多个字符串用回车隔开输入描述:字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。输出描述:删除字符串中出现次数最少的字符后的字符串。思路考察数据结构中,mp的使用。或者直接用一个数组来统计字数也是可以的代码#include<iostream>#inc原创 2020-07-01 14:31:39 · 102 阅读 · 0 评论