
李国栋的算法刷题
leetcode上的算法题
秉麟
努力学习
展开
-
628.三个数的最大乘积
综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;,在数组中找出由三个数组成的最大乘积,并输出这个乘积。输入:nums = [-1,-2,-3]输入:nums = [1,2,3,4]输入:nums = [1,2,3]时间复杂度:O(n*logn)原创 2023-03-16 19:08:22 · 297 阅读 · 0 评论 -
728.自除数
自除数原创 2022-11-25 20:01:20 · 281 阅读 · 0 评论 -
27.移除元素
力扣27原创 2022-10-08 20:35:33 · 100 阅读 · 0 评论 -
1749.任意子数组和的绝对值的最大值
力扣1749原创 2022-10-08 14:13:22 · 415 阅读 · 0 评论 -
2341.数组能形成多少数对
力扣2341原创 2022-10-08 13:58:56 · 138 阅读 · 0 评论 -
2413.最小偶倍数
力扣2413原创 2022-10-01 20:26:35 · 259 阅读 · 0 评论 -
594.最长和谐子序列
力扣594原创 2022-09-30 23:14:59 · 174 阅读 · 0 评论 -
如果动态定义一个m行, n列的2维数组(经典面试题)
面试题原创 2022-09-30 22:57:38 · 1042 阅读 · 0 评论 -
575.分糖果
力扣575原创 2022-09-29 19:39:55 · 241 阅读 · 0 评论 -
557.反转字符串中的单词
力扣557原创 2022-09-29 14:21:44 · 258 阅读 · 0 评论 -
551.学生出勤记录1
给你一个字符串s中表示一个学生的出勤记录,其中的每个字符用来标记每天的出勤情况(缺勤,迟到,到场)。记录中只含下面三种字符:1.'A':Absent,缺勤2.'L':Late,迟到3.'p'Present,到场如果学生可以同时满足下面两个条件,则获得出勤奖励:1.按总出勤计,学生缺勤严格少于两天2.学生不会存在连续三天或连续三天以上的迟到记录如果学生可以获得出勤奖励,返回true,否则,返回false方法:一次遍历可奖励的出勤记录要求缺勤次数少于 2 和连续迟到次数少于原创 2022-09-28 17:36:50 · 272 阅读 · 0 评论 -
541.反转字符串
给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k个字符中的前k个字符。1.如果剩余字符少于k个,则将剩余字符全部反转。2.如果剩余字符小于2k个但多于k个,则反转前k个字符,其余字符保持原样。示例 1:输入:s = "abcdefg", k = 2输出:"bacdfeg"示例 2:输入:s = "abcd", k = 2输出:"bacd"思路:模拟法我们直接按题意进行模拟:反转每个下标从2k的倍数开始的,长度为k的子串。若该子串长度不足k,则原创 2022-09-28 16:21:16 · 227 阅读 · 0 评论 -
504.七进制数
给定一个整数num,将其转化为7进制,并以字符串形式输出。示例一:输入:num =100输出:"202"示例二:输入:num=-7输出:"-10"思路:倒推char * convertToBase7(int num){ if (num==0) return "0"; bool negative=num<0; if (negative) { num=abs(num); } char *res=原创 2022-09-27 23:09:35 · 253 阅读 · 0 评论 -
521.最长特殊序列
给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) 。字符串 s 的子序列是在从 s 中删除任意数量的字符后可以获得的字符串。例如,"abc" 是 "aebdc" 的子序列,因为删除 "aebdc" 中斜体加粗的字符可以得到 "abc" 。 "aebdc" 的子序列还包括 "aebdc" 、 "aeb" 和 "" (空字符串)。示例 1:输入原创 2022-09-27 22:13:55 · 314 阅读 · 0 评论 -
507.完美数
对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。示例 1:输入:num = 28输出:true解释:28 = 1 + 2 + 4 + 7 + 141, 2, 4, 7, 和 14 是 28 的所有正因子。示例 2:输入:num = 7输出:falsebool checkPerfectNumber(int num){ if (num==1) {原创 2022-09-26 23:01:31 · 213 阅读 · 0 评论 -
520.检测大写字母
我们定义,在以下情况时,单词的大写用法是正确的:全部字母都是大写,比如 "USA" 。单词中所有字母都不是大写,比如 "leetcode" 。如果单词不只含有一个字母,只有首字母大写, 比如 "Google" 。给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。示例 1:输入:word = "USA"输出:true示例 2:输入:word = "FlaG"输出:falsebool detectCapitalUse(char * word){原创 2022-09-26 22:19:57 · 176 阅读 · 0 评论 -
递归法求n的介成
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>long int f(int n){ long int y=0; if (n < 0) return -1; else if (n == 0) return 1; else { y = n * f(n - 1); } return y;}int main(){ int n=0;原创 2022-09-26 21:15:38 · 258 阅读 · 0 评论 -
2048游戏带图形界面
# define _CRT_SECURE_NO_WARNINGS#undef UNICODE# include <stdio.h># include <stdlib.h># include <time.h># include <conio.h># include <graphics.h>int arr[4][4] = { 0 };IMAGE img[12];int imgindex[12] = { 0,2,4,8,16,32,6原创 2022-09-24 08:30:27 · 423 阅读 · 0 评论 -
比较条件操作和内存操作的时间快慢
#define _CRT_SECURE_NO_WARNINGS# include <stdio.h># include <assert.h># include <time.h># include <stdlib.h># include <string.h>int filefunction(int n){ int* res = (int*)calloc(n,sizeof(int)); assert(res != NULL原创 2022-09-21 22:53:39 · 269 阅读 · 1 评论 -
492.构造矩形
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:1.你设计的矩形页面必须等于给定的目标面积。2.宽度W不应大于长度L,换言之,要求L>=W。3.长度L和宽度W之间的距离应尽可能的小.示例1:输入: 4输出: [2, 2]解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。但是根据要求2,[1,4] 不符合原创 2022-09-21 16:05:09 · 192 阅读 · 0 评论 -
485.最大连续1的个数
给定一个二进制数组nums,计算其中最大连续1的个数。示例 1:输入:nums = [1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.示例 2:输入:nums = [1,0,1,1,0,1]输出:2方法:一次遍历为了得到数组中最大连续 1 的个数,需要遍历数组,并记录最大的连续 1 的个数和当前的连续 1 的个数。如果当前元素是 1,则将当前的连续 1 的个数加 1,否则,使用之前的连续 1 的个数更新最大的连续 1的个原创 2022-09-21 15:37:05 · 197 阅读 · 0 评论 -
476.数字的补数
对整数的二进制取反后,再转换成十进制表示,可以得到这个整数的补数。示例 1:输入:num = 5输出:2解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。示例 2:输入:num = 1输出:0解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。正常进行十进制转换为二进制的循环,在每一次循环中就该位置的二进制取反并还原为十进制。int findComplement(int num){ int i=0;原创 2022-09-21 15:11:59 · 186 阅读 · 0 评论 -
461.汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给你两个整数x和y,计算并返回它们之间的汉明距离。示例 1:输入:x = 1, y = 4输出:2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑上面的箭头指出了对应二进制位不同的位置。示例 2:输入:x = 3, y = 1输出:1算法思路:移位计数法利用位运算异或^,那么输入位不同的距离输出结果为1,即计算数字对应二进制位不同位置数目时只需要统计两数异或后1的个数。每原创 2022-09-19 19:18:44 · 205 阅读 · 0 评论 -
有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输人10个学
# define _CRT_SECURE_NO_WARNINGS# include <stdio.h>typedef struct student{ int id; char name[20]; double score[3];}student;void Input(student* arr, int len){ printf("请输入%d个学生信息\n", len); printf("学号 姓名 成绩1 成绩2 成绩3\n"); f原创 2022-09-09 17:41:53 · 3668 阅读 · 0 评论 -
有 3 个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果
解题思路:设一个结构体数组,数组中包含 3 个元素;每个元素中的信息应包括候选人的姓名和得票数;输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加 1;输出所有元素的信息。# define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>typedef struct person{char name[10];i原创 2022-09-09 16:47:40 · 3337 阅读 · 0 评论 -
1154.一年中的第几天
给你一个字符串data,按YYYY-MM-DD格式表示一个现行公元纪年法日期。返回该日期是当年的第几天。示例 1:输入:date = "2019-01-09"输出:9解释:给定日期是2019年的第九天。示例 2:输入:date = "2019-02-10"输出:41方法一:直接计算思路与算法我们首先从给定的字符串 date 中提取出年 year,月 month 以及日 day。这样一来,我们就可以首先统计到 month 的前一个月为止的天数。这一部分只需要使用一个长度为 1原创 2022-09-07 10:22:13 · 682 阅读 · 1 评论 -
定义一个包含年月日的结构体Day,实现一个函数,根据传入的结构体指针计算,该日期是当年的第几天?
# define _CRT_SECURE_NO_WARNINGS# include <stdio.h>struct Day{ int year; int mother; int day;};int GetDay(const struct Day* pd){ int arr[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; int sum = 0; if ((pd->year % 4 ==原创 2022-09-07 06:37:14 · 752 阅读 · 0 评论 -
定义一个学生结构体,包含姓名,年龄,三科成绩,从键盘获取三个学生的数据并输出这三个学生的信息
第一、二题//# define _CRT_SECURE_NO_WARNINGS//# include <stdio.h>//struct Student//{// char name[3];// int age;// double score[3];//};//int main()//{// struct Student stu[3];// printf("请输入个学生的信息\n");// for (int i = 0; i <原创 2022-09-07 06:34:04 · 3797 阅读 · 0 评论 -
231.2的幂
给你一个整数n,请你判断该整数是否是2的幂次方。如果是,返回true;否则返回false。如果存在一个整数x使得n==2^x,则认为n是2的幂次方。示例 1:输入:n = 1输出:true解释:20 = 1示例 2:输入:n = 16输出:true解释:24 = 16示例 3:输入:n = 3输出:false示例 4:输入:n = 4输出:true示例 5:输入:n = 5输出:false方法一:二进制表示思路与算法一个数n是2的幂,当且仅当n是正整原创 2022-09-04 07:57:45 · 285 阅读 · 0 评论 -
459.重复的子字符串
给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。示例 1:输入: s = "abab"输出: true解释: 可由子串 "ab" 重复两次构成。示例 2:输入: s = "aba"输出: false示例 3:输入: s = "abcabcabcabc"输出: true解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)枚举法:如果一个长度为n的字符串s可以由它的一个长度为n'的子串重复多次构成,那么:1.n一原创 2022-09-03 17:59:59 · 181 阅读 · 0 评论 -
169.多数元素
给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例一:输入:nums = [3,2,3]输出:3示例二:输入:nums = [2,2,1,1,1,2,2]输出:2算法思路:快速排序解题思路因为多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。所以对元素排序后,n/2一定是多数元素。复杂度分析N为数组长度时间复杂度:O(N*logN)空间原创 2022-09-03 14:29:10 · 102 阅读 · 0 评论 -
121.买卖股票的最佳时机
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。示例一:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因原创 2022-09-03 11:38:06 · 105 阅读 · 0 评论 -
455.分发饼干
假设你是一个很棒的家长,想要给孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且没块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足数量多的孩子,并输出这个最大数值。示例1:输入: g = [1,2,3], s = [1,1]输出: 1解释:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。原创 2022-09-02 11:32:37 · 173 阅读 · 0 评论 -
找出数组中两个不成对的数
求数组中两个不成对的数字利用输出参数求解:# include <stdio.h># include <assert.h>bool GetUniquetwo(int* arr, int len,int*sub1,int*sub2){assert(arr != NULL && sub1 != NULL && sub2 != NULL && len > 0);int ans = 0;int c =原创 2022-08-24 18:15:09 · 178 阅读 · 0 评论 -
输出参数的例题
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,则输出任意一对即可,返回和为s的两个下标# include <stdio.h># include <assert.h>bool GetSubscript(int* arr, int len,int*sub1,int*sub2,int sum){assert(arr != NULL && sub1 != NULL && sub2原创 2022-08-24 17:28:33 · 108 阅读 · 0 评论 -
面试题01.05.一次编辑
字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。给定两个字符串,编写一个函数判断他们是否只需要一次(或者零次)编辑。示例一:输入:first="pale",second="ple"输出:true示例二:输入:first="pales",second="pal"输出:false方法:分情况讨论假设字符串first和second的长度分别为m和n。如果first和second需要一次编辑,则可能有三种情况:1.往first中插入一个字符得到原创 2022-07-22 18:19:20 · 368 阅读 · 0 评论 -
392.判断子序列
给定字符串s和t,判断s是否是t的子序列字符串中的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(如,"ace"是"abce"的一个子序列,而"ace"不是)。示例 1:输入:s = "abc", t = "ahbgdc"输出:true示例 2:输入:s = "axc", t = "ahbgdc"输出:false解法:双指针本题询问的是,s是否是 t的子序列,因此只要能找到任意一种 s 在 t中出现的方式,即可认为 s是 t 的..原创 2022-07-23 13:24:13 · 282 阅读 · 0 评论 -
383.赎金信
给你两个字符串:ransomNote和magazine,判断ransomNote能不能由magazine里面的字符串构成。如果可以,返回true;否则返回falsemagazine中的每个字符只能在ransomNote中使用一次。示例 1:输入:ransomNote = "a", magazine = "b"输出:false示例 2:输入:ransomNote = "aa", magazine = "ab"输出:false示例 3:输入:ransomNote = "aa",原创 2022-07-23 08:18:19 · 147 阅读 · 0 评论 -
389.找不同
给定两个字符串s和t,它们只包含小写字母。字符串t有字符串s随机重排,然后在随机位置添加一个字母,请找出在t中被添加的字母。示例一:输入:s="abcd",t="abcde"输出:"e"示例二:输入:s="",t="y"输出:"y"方法一:计数首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。.原创 2022-07-23 09:38:49 · 220 阅读 · 0 评论 -
387.字符串中的第一个唯一字符
给定一个字符串s,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回-1。示例一:输入:s="leetcode"输出:0示例二:输入:"loveleetcode输出:2示例三:输入:"aabb"输出:-1解法:hashSet顺序存储关键点有:1.使用一个桶数组,遍历所有可能2.判断桶数组中的第一个等于1,进行返回intfirstUniqChar(char*s){ intcnt[100000]={0}; int...原创 2022-07-23 08:57:46 · 98 阅读 · 0 评论