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 ^ 5
1 <= 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刷题 --杂篇 --数组,链表,栈,队列
武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...
随机推荐
- docker安装,err:exit status 255,提示找不到虚拟机IP
我遇到这个问题是因为,BIOS没有打开虚拟化技术,导致虚拟机无法成功创建,自然找不到IP. 解决: 1.进入BIOS,高级选项卡下,找到虚拟化技术开关,打开即可.具体做法,可搜网文. 2.删除原来自动 ...
- jmeter断言接口响应字段大小
一,有时候断言需要判断接口返回某个字段值是否大于或者小于预期值,此时断言需要用到BeanShell断言 写法如下: import com.alibaba.fastjson.JSONObject; // ...
- 剑指offer-扑克牌顺子
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...
- Chrome浏览器添加控件
1. 添加user agent swithcher模拟浏览器内核 方法: 下载user agent switcher后,打开谷歌浏览器,先复制chrome://extensions/ 到浏览器地址栏 ...
- 使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住
原因:在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住.下次就不能执行增删操作. 解决:1.查询 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(三)
1, 前面两篇文章我们知道了怎么使用常用的四种标签,现在我们结合我们自己的项目中去简单的使用 在我们搭建项目的时候,一般会创建自己的Application,在里面进行一些初始化如一些第三方的Green ...
- [小程序] 微信小程序 picker 中range-key中必须带单引号
原文地址:http://blog.csdn.net/u012329294/article/details/74906504 <view class="section"> ...
- (转)批量插入sql语句
为了减少数据库连接的I/O开销,一般会把多条数据插入放在一条SQL语句中一次执行.1.INSERT INTO TABLE(col1, col2) VALUES(val11, val12), (val2 ...
- Lua 哑变量
[1]哑变量 哑变量,又称为虚拟变量.名义变量. 还得理解汉语的博大精深,‘虚拟’.‘名义’.‘哑’等等,都是没有实际意义.所以,哑变量即没有现实意义的变量. 哑变量的应用示例如下: local fi ...
- java 命令查字节码文件, 查.class文件内容
1. 需要用javac,javap命令,所以先配下环境变量 2.配置环境变量 单击“计算机-属性-高级系统设置”,单击“环境变量”.在“系统变量”栏下单击“新建”,创建新的系统环境变量. 3.写需要用 ...