leetcode刷题记录(一)

时间: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、有效的括号

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

    思路:栈,先进后出

    代码:https://leetcode-cn.com/submissions/detail/23353280/

50、实现 pow(xn) ,即计算 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语言真不友好,各种报错,也可能是我太菜了!下周继续加油

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值