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. 1 <= A.length <= 50000
  2. -10 ^ 5 <= A[i] <= 10 ^ 5
  3. 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

其他

廖雪峰:回数判断

题目

回数是指从左向右读和从右向左读都是一样的数,例如12321909。请编写函数,返回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实战的更多相关文章

  1. LeetCode实战练习题目 - Array

    实战练习题目 - Array 盛最多水的容器 class Solution { public: int maxArea(vector<int>& height) { int res ...

  2. LeetCode刷题 DFS+回溯

    一.DFS介绍 二.LeetCode 实战 LC 17. 电话号码的字母组合 解法思路 解题步骤 代码 LC 79. 单词搜索 解题思路 解题步骤 代码 LC 46. 全排列 解题思路一 解题步骤 代 ...

  3. LeetCode刷题 字符串详解

    一.字符串常用的操作 1. string类 1.1 string的定义与初始化 1.1.1 string的定义 1.1.2 string的初始化 1.2 string的赋值与swap.大小操作.关系运 ...

  4. 菜鸟系列 Golang 实战 Leetcode —— 面试题24. 反转链表

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.   示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...

  5. 初刷LeetCode的感受

    自从上个月进入实验室的云安全项目组后,因为要接触到实际的代码,在实验室博士的建议下我们项目组的硕士开始刷LeetCode练习编程能力,保持每周抽空刷几道算法题.虽然刷的不多,到现在一共只刷了不到30题 ...

  6. vue2.0与实战开发

    慕课网实战 百度云 web前端实战: Node.js入门到企业Web开发中的应用 Web前端性能优化 让你的页面飞起来 前端跳槽面试必备技巧 前端JavaScript面试技巧全套 node.JS 线上 ...

  7. 【LeetCode】数组--合并区间(56)

    写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...

  8. 爬取LeetCode题目——如何发送GraphQL Query获取数据

    前言   GraphQL 是一种用于 API 的查询语言,是由 Facebook 开源的一种用于提供数据查询服务的抽象框架.在服务端 API 开发中,很多时候定义一个接口返回的数据相对固定,因此要获得 ...

  9. LeetCode刷题 --杂篇 --数组,链表,栈,队列

    武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...

随机推荐

  1. docker安装,err:exit status 255,提示找不到虚拟机IP

    我遇到这个问题是因为,BIOS没有打开虚拟化技术,导致虚拟机无法成功创建,自然找不到IP. 解决: 1.进入BIOS,高级选项卡下,找到虚拟化技术开关,打开即可.具体做法,可搜网文. 2.删除原来自动 ...

  2. jmeter断言接口响应字段大小

    一,有时候断言需要判断接口返回某个字段值是否大于或者小于预期值,此时断言需要用到BeanShell断言 写法如下: import com.alibaba.fastjson.JSONObject; // ...

  3. 剑指offer-扑克牌顺子

    题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...

  4. Chrome浏览器添加控件

    1. 添加user agent swithcher模拟浏览器内核 方法: 下载user agent switcher后,打开谷歌浏览器,先复制chrome://extensions/  到浏览器地址栏 ...

  5. 使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住

    原因:在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住.下次就不能执行增删操作. 解决:1.查询 ...

  6. Android -- 带你从源码角度领悟Dagger2入门到放弃(三)

    1, 前面两篇文章我们知道了怎么使用常用的四种标签,现在我们结合我们自己的项目中去简单的使用 在我们搭建项目的时候,一般会创建自己的Application,在里面进行一些初始化如一些第三方的Green ...

  7. [小程序] 微信小程序 picker 中range-key中必须带单引号

    原文地址:http://blog.csdn.net/u012329294/article/details/74906504 <view class="section"> ...

  8. (转)批量插入sql语句

    为了减少数据库连接的I/O开销,一般会把多条数据插入放在一条SQL语句中一次执行.1.INSERT INTO TABLE(col1, col2) VALUES(val11, val12), (val2 ...

  9. Lua 哑变量

    [1]哑变量 哑变量,又称为虚拟变量.名义变量. 还得理解汉语的博大精深,‘虚拟’.‘名义’.‘哑’等等,都是没有实际意义.所以,哑变量即没有现实意义的变量. 哑变量的应用示例如下: local fi ...

  10. java 命令查字节码文件, 查.class文件内容

    1. 需要用javac,javap命令,所以先配下环境变量 2.配置环境变量 单击“计算机-属性-高级系统设置”,单击“环境变量”.在“系统变量”栏下单击“新建”,创建新的系统环境变量. 3.写需要用 ...