时间:2019-07-13 到 2019-07-20
题号:1、2、3、4、6、7、8、9、11、12、13、14、20、50、122、134、135、136、415
题目详细:
1、给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
思路:暴力
代码:https://leetcode-cn.com/submissions/detail/22783334/
2、给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
思路:单链表求和
struct ListNode
{
int val;
struct ListNode *next;
}
struct ListNode * head = NULL;
struct ListNode * l3 = NULL;
while(1)
{
struct ListNode * node = NULL; //node为当前节点
node->val = 1;
node->next = NULL;
if(head == NULL)
head = node;
else
l3 = node->next;
l3 = node;
}
代码:https://leetcode-cn.com/submissions/detail/22933316/
3、给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
思路1:双指针
while(r < length && l < length - 1 && l + maxLength < length)
{
if(r <= l)
r = l + 1;
temp = l;
while(s[r] != s[temp] && r < length)
{
if(r - temp == 1)
{
r++;
temp = l;
}
else
temp++;
}
curLength = r - l;
if(maxLength < curLength)
maxLength = curLength;
l++;
}
思路2:哈希表
int m[256]={0};//字符有256个
int left=0;//查找的左边界
int mlen=0;//结果
int length = strlen(s);
for(int i=0;i<length;i++)
{
if(m[s[i]]==0||m[s[i]]<left)
{
mlen = mlen > (i-left+1) ? mlen : (i-left+1);
}
else
{
left=m[s[i]];
}
m[s[i]]=i+1;
}
return mlen;
注解:
1.查找范围:left->i 的大小
2.m[s[i]]=0代表该字符s[I]未出现过
3.若m[s[i]]!=0,则m[s[i]]当前的大小代表字符s[i]再次出现时应该查找的起始位置,对应left的值
4.若m[s[i]]<left说明字符s[i]上一次出现的位置不在当前的查找范围,这就是为什么if语句要那样写
代码:https://leetcode-cn.com/submissions/detail/22968425/
4、给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
思路:将两个有序数组组成一个新的数组,数组长度为(num1Size + num2Size)/2 + 1
代码:https://leetcode-cn.com/submissions/detail/23042314/
6、将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
思路:找通项公式
代码:https://leetcode-cn.com/submissions/detail/23152437/
7、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
思路:反转,注意反转后是否越界
代码:https://leetcode-cn.com/submissions/detail/23173440/
8、请你来实现一个 atoi
函数,使其能将字符串转换成整数。
思路:注意字符串转换成整数后是否越界
代码:https://leetcode-cn.com/submissions/detail/23213206/
9、判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
思路:输出逆序整数,比较是否相同。注意整数越界
代码:https://leetcode-cn.com/submissions/detail/23204629/
11、给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
思路1:暴力
思路2:双指针
while(l<r)
{
area = min(h[l],h[r])*(r-l);
if(h[l] < h[r])
l++;
else
r--;
}
代码:https://leetcode-cn.com/submissions/detail/23218949/
12、整数转罗马数字
代码:https://leetcode-cn.com/submissions/detail/23235953/
13、罗马数字转整数
代码:https://leetcode-cn.com/submissions/detail/23240034/
14、编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
。
思路:N指针
代码:https://leetcode-cn.com/submissions/detail/23243592/
20、有效的括号
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
思路:栈,先进后出
代码:https://leetcode-cn.com/submissions/detail/23353280/
50、实现 pow(x, n) ,即计算 x 的 n 次幂函数。
思路:快速幂,递归
n%2 == 0时, x的N次幂 = x的(n/2)次幂 * x的(n/2)次幂;
n%2 == 1时, x的N次幂 = x的(n/2)次幂 * x的(n/2)次幂 * x;
代码:https://leetcode-cn.com/submissions/detail/23052221/
122、给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
思路:从全局看,每日最优即最大利润
代码: https://leetcode-cn.com/submissions/detail/23313685/
134、在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
思路:暴力:
代码:https://leetcode-cn.com/submissions/detail/23317146/
135、老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
思路:四次遍历
第一次遍历:找到波谷的值
第二、三次遍历:找到波中的值,正反各遍历一次
第四次遍历:找到波峰的值
代码:https://leetcode-cn.com/submissions/detail/23343749/
136、给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
思路:异或位运算 res^=nums[i]; 两个输入相同时为0,不同则为1 or
res^=nums[i]
代码:https://leetcode-cn.com/submissions/detail/23357484/
415、给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
思路:大整数相加,注意边界
代码:https://leetcode-cn.com/submissions/detail/22933152/
感想:leetcode对C语言真不友好,各种报错,也可能是我太菜了!下周继续加油