167.两数之和 II - 输入有序数组
给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
example:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
解题思路
双指针,一个从小往大,一个从大往小
len():输出元素个数
return():输出结果并终止
代码
class Solution(object):
def twoSum(self, numbers, target):
n = len(numbers)
i = 0
j = n -1
while (i<j):
if numbers[i] + numbers[j] == target:
return(i+1,j+1)
elif numbers[i] + numbers[j] > target:
j -= 1
else:
i += 1
633. 平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。
example:
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5
解题思路
int():函数返回整数
math.sqrt():返回平方根
其他和T167.Two Sum一样
代码
class Solution(object):
def judgeSquareSum(self, c):
i = 0
j = int(math.sqrt(c))
while (i<=j):
sqSum = i*i + j*j
if sqSum == c:
return True
elif sqSum > c:
j -= 1
else:
i += 1
return False
345. 反转字符串中的元音字母
- 编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
解题思路
双指针,i从0开始寻找元音,j从len(s)-1开始寻找。相遇就停止。
list()函数:替换元组为列表,用于修改元素。(元组不能修改)
创造元音列表vowels,注意还有大写情况。
join()函数:以指定分隔符连接列表,元组,字符串中的元素。
代码
class Solution(object):
def reverseVowels(self, s):
target = list(s)
vowels = ["a","e","i","o","u","A","E","I","O","U"]
i = 0
j = len(s) - 1
while i < j :
if target[i] not in vowels:
i += 1
elif target[j] not in vowels:
j -= 1
else:
target[i],target[j]=target[j],target[i]
i += 1
j -= 1
return "".join(target)
680. 验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
example:
输入: "aba"
输出: True
解题思路
s = s[::-1] 判断反转后与原字符串是否相同,真则直接返回
双指针法,i从左,j从右,s[i] != s[j]时有两种情况:
1.删右,判断a=s[i:j]是否为回文字符串
2.删左,判断b=s[i+1,j+1]是否为回文字符串
a or b 满足即为真,不满足即为否
注意:不要忘了s[i]=s[j]时,i,j要移位,不然无限循环报错超时。
如果i>=j就输出False
代码
class Solution(object):
def validPalindrome(self, s):
if s == s[::-1]:
return True
i,j = 0,len(s) -1
while i < j:
if s[i] != s[j]:
a = s[i:j]
b = s[i+1:j+1]
if a == a[::-1]:
return True
if b == b[::-1]:
return True
return False
else:
i += 1
j -= 1
return False
88.合并有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
链接:https://leetcode-cn.com/problems/merge-sorted-array
example:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解题思路
del函数,利用数组的有序性,先从后往前把nums1的多余删除掉
append函数,将nums2元素逐个添加到nums1中
sort函数,将新nums1重新排序
代码
class Solution(object):
def merge(self, nums1, m, nums2, n):
for i in range(len(nums1)-1,m-1,-1):#利用nums1已经是有序的,从后往前把多余的删除
del nums1[i]
for i in range(len(nums2)):
nums1.append(nums2[i])#append函数,将nums2元素逐个添加到nums1中
return nums1.sort()#sort函数排序
141. 环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
链接:https://leetcode-cn.com/problems/linked-list-cycle
example:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
双指针解题思路
- 先判断head是否为空,不为空才能执行fast.next,不然报错:NoneType
- while循环:
- fast每次跳两格,slow每次跳一格,如果循环必然会相遇
- fast跳两格前需验证fast.next是否为空
代码
class Solution(object):
def hasCycle(self, head):
if not head:#判断head是否为空
return False
fast,slow = head.next,head
while fast and slow:
if fast == slow:
return True
if fast.next:
fast = fast.next.next
else:
return False
slow = slow.next
return False
列表解题思路
- 构造列表set
- 遍历一个元素,加add()一个
- 利用.next迭代下一个
- 当元素已经存在set中时,停止,return True
代码
class Solution(object):
def hasCycle(self, head):
#定义一个列表set()
s = set()
while head:
if head in s:
return True#如果遍历到一个元素已经存在,则有循环
s.add(head)
head = head.next
return False