算法刷题
包括leetcode每日一题,以及按照数组-链表-哈希表-字符串-双指针法-栈与队列-二叉树-回溯-贪心等顺序进行刷题记录
算法入门中
Don't worry,be happy!
展开
-
算法题之环相关练习题
141. 环形链表python中的字典是基于哈希表实现的,因此本题我们可以利用python中的字典来解决:如果有环的话,一些数据肯定会重复出现,因此一旦出现重复数字,就可判断有环。class Solution: def hasCycle(self, head: ListNode) -> bool: num = set() while head: if head in num: return Tr原创 2020-12-31 15:05:10 · 240 阅读 · 0 评论 -
205. 同构字符串
205. 同构字符串运用哈希表解决此题class Solution: def isIsomorphic(self, s: str, t: str) -> bool: dict = {} for i in range(len(s)): if s[i] not in dict: if t[i] in dict.values(): return False原创 2020-12-27 10:33:56 · 85 阅读 · 0 评论 -
455. Assign Cookies
455. Assign Cookies贪心策略,大饼干既可以满足胃口大的孩子,也可以满足胃口小的孩子,那么应该优先满足胃口大的。局部最优就是大饼干喂给胃口大的,全局最优就是喂饱尽可能多的小孩。class Solution: def findContentChildren(self, g, s): g.sort() s.sort() res = 0 begin = 0 for i in range(0, len(g原创 2020-12-25 22:21:56 · 54 阅读 · 0 评论 -
135. Candy(贪心算法)
135. Candy解法一:一前一后两次遍历数组,第一次从前往后遍历,保证前一个小孩的分数比后一个小孩分数大时,前一个小孩的糖果比后者多一,但此时只考虑了前一个比后一个大还有两者相同的情况,再进行一次从后往前遍历,如果前一个比后一个大,则前一个的糖果数为后一个糖果数加一与当前糖果数的较大者。class Solution: def candy(self, ratings): if len(ratings) == 0: return 0原创 2020-12-24 21:14:52 · 199 阅读 · 0 评论 -
leetcode数组篇(暴力解法,二分法,双指针法)
题目均在leetcode35. Search Insert Position解法一:暴力解法两种情况,目标值在所有元素之后以及目标替换掉第一个比他大的元素class Solution: def searchInsert(self, nums, target) -> int: for i in nums: if i >= target: return nums.index(i) ret.原创 2020-12-23 22:49:57 · 135 阅读 · 0 评论 -
387. First Unique Character in a String
题目链接herepython代码# 开发时间:2020/12/23 10:34# 开发工具:PyCharm# 开发者:Fridayclass Solution: def firstUniqchar(self, s:str) -> int: a = [0] * 27 for x in s: num = ord(x) - 96 a[num] += 1 for y in s:原创 2020-12-23 10:48:59 · 39 阅读 · 0 评论 -
406.Queue Reconstruction by Height(根据身高重排队列)
思路:首先利用h[i]和k[i]将原数组排序,那么怎么利用呢?可以以h[i]为主,k[i]为辅,即按照身高从高往低的顺序排,如果两者身高相同,则按照前面比他高的人数k[i]排,越少越靠前。然后再重新定义一个二维数组,用以存放最终结果。遍历排好序的数组,将他们以k[i]进行对应位置的插入,即k[i]决定了他们在新数组中的位置。因为个子高的插入先后顺序对个子低的会有影响,而各自低的插入后对个子高的没有影响,所以我们首先按照由高到矮的顺序排序,然后再依次插入到新数组中。代码实现(C++):class原创 2020-12-19 15:13:32 · 175 阅读 · 1 评论 -
1640.Check Array Formation Through Concatenation 能否连接形成数组
题目描述本题用到了一个哈希表,首先将arr数组的元素映射到哈希表上,然后在去遍历pieces数组,如果hash[pieces[i][j]]对应的索引值为零,则返回false,在保证pieces数组中的元素全部都与arr数组元素的值都对应的同时,还得保证pieces数组中的数组元素的顺序与arr数组中元素的顺序一致,这就要求pieces当前行(pieces是二维数组)的元素在arr中是连续的,即对应元素的索引值相差一。代码如下:class Solution {public: bool原创 2020-11-06 21:47:39 · 100 阅读 · 0 评论 -
1470. Shuffle the Array重新排列数组
题目描述看一下前几个元素的位置变化,可以发现前n个元素的位置变化的规律是:第i个元素在经过重新排列后,其位置就变成了2i,也就是占据所有的偶数位;而后n个元素便占据所有的奇数位。题解如下:class Solution {public: vector<int> shuffle(vector<int>& nums, int n) { vector<int>tables(2*n,1001); int i;原创 2020-11-06 08:55:08 · 102 阅读 · 0 评论 -
941.Valid Mountain Array有效的山脉数组
题目描述写的有点乱,没有技巧,纯暴力。题解(C++):class Solution {public: bool validMountainArray(vector<int>& A) { int len=A.size(); if(len<3) return false; int flag; for(int i=1;i<len;i++){ if(A[i]<A[i-1]){原创 2020-11-03 22:47:31 · 59 阅读 · 0 评论 -
1024Video Stitching视频拼接
题目描述今天是程序员节,祝各位节日快乐!码到成功!这是属于程序员的最好的时代!现在不努力,更待何时?好,下面来看题解(C++)。这道题采用了动态规划的解法。dp[i]代表覆盖0-i所需片段的最小数目。class Solution {public: int videoStitching(vector<vector<int>>& clips, int T) { vector<int> dp(T+1,INT_MAX-1);原创 2020-10-24 15:24:59 · 3575 阅读 · 0 评论 -
763. Partition Labels划分字母
题目·描述用哈希表存放每个字母出现的最后位置,然后从头到尾遍历字符,找到字符串片段的分割点。需要注意的一点就是,不要把S.size()放到for循环里面去,提前把他算出来,直接用他的值,这样可以减少程序运行时间。因为for循环每执行一次,就会调用这个函数,造成了无谓的时间开销。class Solution {public: vector<int> partitionLabels(string S) { int hash[27]={0}; int l原创 2020-10-23 00:19:09 · 70 阅读 · 0 评论 -
leetcode之925长按键入
题目描述题解:通过分析题目及示例可以得出,本题是让求解name代表的字符串是否是typed代表字符串的子序列(注意与子串有区别)。这里我采用双指针的方法来求解。代码如下:class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: l1=len(name) l2=len(typed) i=0 #指向name的指针 j=0 #指向typ原创 2020-10-21 23:06:43 · 78 阅读 · 0 评论 -
leetcode刷题之877鸡蛋掉落
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值的最小移动次数是原创 2020-10-20 20:55:07 · 157 阅读 · 0 评论 -
斜着遍历二维数组
for(int l=2;l<=n;l++){ for(int i=0;i<=n-l;i++){ int j=i+n-1; }}如数组{{1,2,3},{4,5,6},{7,8,9},}遍历之后的结果是2,6,3。相当于遍历对角线上面的元素。原创 2020-10-16 19:16:40 · 593 阅读 · 0 评论 -
leetcode刷题之矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个.原创 2020-10-08 11:14:06 · 99 阅读 · 0 评论 -
Lake Counting(深度优先搜索方法)
有一个大小为 N×M 的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对 W 的.的部分)其中W是积水,.是干地….W.…限制条件N, M ≤ 100输入样例:N=10, M=12园子如下图(’W’表示积水, ‘.’表示没有积水)W………WW..WWW……WWW….WW…WW.………WW.………W……W……W….W.W……WW.W.W.W……W..W.W……W.…W…….W.输出:3#include &l原创 2020-07-05 19:46:41 · 619 阅读 · 1 评论 -
深度优先搜索(DFS,Depth-First Search):部分和问题
给定整数a1,a2,…,an,判断是否可以从中选出若干数,使他们的和恰好为k。限制条件1 <=n <=201e-8 <= ai <= 1e+81e-8 <= k <= 1e+8#include <cstdio>#include <stack>using namespace std;stack<int> s;//声明存储int类型数据的栈const int MAX_N=21;int a[MAX_N];int n原创 2020-06-24 15:40:30 · 151 阅读 · 0 评论 -
计算程序运行时间
clock() / CLOCKS_PER_SEC,单位为秒。clock()函数返回进程运行时间,但是这个运行时间单位不是秒,而是CPU运行的时钟周期计数。CLOCKS_PER_SEC是标准c的time.h头函数中宏定义的一个常数,表示一秒钟内CPU运行的时钟周期数(时钟频率)。...原创 2020-05-05 10:32:34 · 1421 阅读 · 0 评论 -
选择排序
有n个坑位,但最后一个坑位不用特意为它找对象。第一个坑位为它安排最小的值,第二个坑位第二小…最后一个坑位安排最大值。#include <stdio.h>void swap(int *a,int *b) //交换两个数的值 { int temp = *a; *a = *b; *b = temp;}void selection_sort(int arr[]...原创 2020-05-04 17:14:39 · 111 阅读 · 0 评论 -
冒泡排序
需要进行二重循环,第一层表示进行几轮比较,第二层每轮比较的次数,需要清楚的是,n个元素需要比较的轮数为n-1,第i轮与第i轮需要比较的次数j有如下关系:i+j=n-1(i从0开始)。#include <stdio.h>void bubble_sort(int arr[],int len){ int i,j,temp; for(i=0;i<len-1;i++) { ...原创 2020-05-04 16:42:30 · 74 阅读 · 0 评论 -
K-进制数
问题描述:考虑N位K-进制数的个数. 定义一个数有效, 如果其K-进制表示不包含两连续的0。例:1010230 是有效的7位数1000198 无效0001235 不是7位数, 而是4位数.给定两个数N和K, 要求计算包含N位数字的有效K-进制数的总数.假设2 <= K <= 10; 2 <= N; 4 <= N+K <= 18.输入两个十进制整数N和K...原创 2020-05-04 14:17:13 · 543 阅读 · 0 评论