leetcode实战
leetcode记录
两数之和
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
自己的解答
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
## 保留数组备份,用于后面查找原始索引
pre = nums.copy()
## 对数组进行排序,因为后面的查找过程是首位递进的,这是以数组元素有序为前提的
nums.sort()
## 创建对称数组
list = []
for num in nums:
list.append(target-num)
## 开始首位递进查找,复杂度为O(n)
j = len(nums) - 1
i = 0
while i<j :
if nums[i] < list[j]:
i = i+1
elif nums[i] > list[j]:
j = j-1
## 查找成功,返回索引
else:
## 找到第一个数的索引
a = pre.index(nums[i])
## 为防止结果是一对重复值,调整数组中第一个数的大小,方便查找第二个数的索引(index方法只能查出第一个匹配的索引)
pre[a] = nums[j] + 1
b = pre.index(nums[j])
return a,b
更优解
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hashmap = {}
for index, num in enumerate(nums):
another_num = target - num
if another_num in hashmap:
return [hashmap[another_num], index]
hashmap[num] = index
return None
和至少为 K 的最短子数组
题目
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。
如果没有和至少为 K 的非空子数组,返回 -1 。
示例 1:
输入:A = [1], K = 1
输出:1
示例 2:
输入:A = [1,2], K = 4
输出:-1
示例 3:
输入:A = [2,-1,2], K = 3
输出:3
提示:
1 <= A.length <= 50000-10 ^ 5 <= A[i] <= 10 ^ 51 <= K <= 10 ^ 9
自己的解答
算法初步思路
st=>start: 开始
e=>end: 结束
op1=>operation: ____sublist____
int head,tail,sum
op2=>operation: sum=0,i=-1
op3=>condition: i<len(A)-1?
op6=>operation: i++,sum=sum+A[i]
op4=>operation: tail=i,outlist.append([head,tail,sum])
sum=sum-A[head],head=head+1
cond1=>condition: A[i]<0?
cond2=>condition: sum>=K?
cond3=>condition: sum>0?
op5=>operation: head=i+1,sum=0
op7=>operation: 遍历outlist,输出
st->op1->op2->op3
op3(yes)->op6->cond1
op3(no)->op7
cond1(no)->cond2
cond2(yes)->op4->op3
cond2(no)->op3
cond1(yes)->cond3
cond3(yes)->op3
cond3(no)->op5->op3
op7->e
关键就在于累加时,如果当前数为正值,则有可能sum>k,此时,由于要找最短子数组,继续累加增长子数组的长度没有意义,所以要将子数组的头部右移一位以继续寻找。如果当前值为负值,那就要看sum加上这个负值的结果,如果不大于0,那么当前的子数组没希望了,首先加上这个负数前它也未能达到要求(达到要求就已经存下来了),其次如果我们将整个子数组丢弃,直接从下一个数重新累加显然要更机智。
算法优化
如果说A数组中负数是少数的,那么可否这么考虑:我们将连续为正或负的元素找出来,获取它的始末位置和和:[head,tail,sum],这个向量构成list。
首先遍历list的元素,如果有大于k的head和tail差值最小的,可以直接输出。这个结果一定最短。可以反向思考:除了这个结果,其他结果都是list中的基础元素相互伸展融合得在的,长度一定大于它。
之后遍历list进行处理,过程类似初始算法。
这里的优化体现在,如果存在连续为正的子数组,算法的执行速度会非常地快。
代码
初始版本,测试用例有十几万个,超出时间限制了
class Solution:
def shortestSubarray(self, A, K):
"""
:type A: List[int]
:type K: int
:rtype: int
"""
outlist = []
head = 0
nsum = 0
i = 0
while i<len(A):
nsum = nsum + A[i]
if A[i] >= K:
return 1
if A[i] < 0:
if nsum <= 0:
head = i+1
nsum = 0
if (A[i] >0) and (nsum >= K):
tail = i
outlist.append(tail-head+1)
nsum = 0
head = head +1
i = head -1
i = i+1
if outlist:
outcome = 50000
for num in outlist:
if num < outcome:
outcome = num
return outcome
else:
return -1
其他
廖雪峰:回数判断
题目
回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请编写函数,返回True或False。
自己的解答
def is_palindrome(n):
n = str(n)
for i in range(len(n)//2):
if n[i] != n[len(n)-1-i]: return False
return True
更优解
def is_palindrome(n):
if str(n) == str(n)[::-1]:
return n
leetcode实战的更多相关文章
- LeetCode实战练习题目 - Array
实战练习题目 - Array 盛最多水的容器 class Solution { public: int maxArea(vector<int>& height) { int res ...
- LeetCode刷题 DFS+回溯
一.DFS介绍 二.LeetCode 实战 LC 17. 电话号码的字母组合 解法思路 解题步骤 代码 LC 79. 单词搜索 解题思路 解题步骤 代码 LC 46. 全排列 解题思路一 解题步骤 代 ...
- LeetCode刷题 字符串详解
一.字符串常用的操作 1. string类 1.1 string的定义与初始化 1.1.1 string的定义 1.1.2 string的初始化 1.2 string的赋值与swap.大小操作.关系运 ...
- 菜鸟系列 Golang 实战 Leetcode —— 面试题24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...
- 初刷LeetCode的感受
自从上个月进入实验室的云安全项目组后,因为要接触到实际的代码,在实验室博士的建议下我们项目组的硕士开始刷LeetCode练习编程能力,保持每周抽空刷几道算法题.虽然刷的不多,到现在一共只刷了不到30题 ...
- vue2.0与实战开发
慕课网实战 百度云 web前端实战: Node.js入门到企业Web开发中的应用 Web前端性能优化 让你的页面飞起来 前端跳槽面试必备技巧 前端JavaScript面试技巧全套 node.JS 线上 ...
- 【LeetCode】数组--合并区间(56)
写在前面 老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...
- 爬取LeetCode题目——如何发送GraphQL Query获取数据
前言 GraphQL 是一种用于 API 的查询语言,是由 Facebook 开源的一种用于提供数据查询服务的抽象框架.在服务端 API 开发中,很多时候定义一个接口返回的数据相对固定,因此要获得 ...
- LeetCode刷题 --杂篇 --数组,链表,栈,队列
武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...
随机推荐
- VUE-011-通过 v-if 和 v-for 实现特定值的列表循环匹配,并显示满足匹配条件的值
前端页面开发过程中,经常遇到服务端返回的数据中,存在一些需要转义的表单项.比如,员工信息中的学历,假设研究生学历的代码是101(或10001),则数据库中对应字段存放的是 101(或10001),而非 ...
- python tkinter Text
"""小白随笔,大佬勿喷""" '''tkinter —— text''' '''可选参数有: background(bg) 文本框背景色: ...
- 导出IndoorGML
导出IndoorGML
- Mysql8安装与配置
网上的教程有很多,基本上大同小异.但是安装软件有时就可能因为一个细节安装失败.我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的. 安装环境:win7 1.下载zip安装包: MySQL ...
- 控制反转IOC
IOC-Inversion of Control 控制反转,这是spring的核心.对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 1:控制反转不是一种技术,而是 ...
- git使用手册整理
-------------------20181217------------------- git使用:在gitbash 下初始化用户: $ git config --global user.nam ...
- LigerUI之Grid使用详解(一)——显示数据 --分页
http://www.cnblogs.com/jerehedu/p/4218560.html 首先给大家介绍最常用的数据展示组件Grid,使用步骤如下: 1.页面中正确引入样式文件及相应组件 < ...
- 005-CSS让页脚始终在底部不论页面内容多少
让页脚始终在页面底部,不论页面内容是多或者少页脚始终在页面底部. 方案一: <!DOCTYPE html> <html> <head> <meta chars ...
- java学习之匿名内部类
/*匿名内部类 * * 一般用于抽象类和接口 * 因为他们不能实例化对象所以可以通过匿名内部类来帮助他们实例化 * 下面demo是抽象类的例子 * * */ abstract class Cat{ a ...
- PyCharm:no module named * 解决方法
1.成功安装模块,无法导入 今天安装完模块pyppeteer,pycharm导入失败,从python的Lib下可以清楚的看到已经安装成功 2.添加当前python环境,不使用默认项目的环境 file& ...