LeetCode Online Judge
https://leetcode.com/
LeetCode题解
https://github.com/soulmachine/leetcode
1.Two Sum [2968ms]
#思路1:暴力[5804ms]
#思路2:哈希[2968ms]
class Solution(object):
def twoSum(self, nums, target):
result = []
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
result.append(i)
result.append(j)
return result
class Solution(object):
def twoSum(self, nums, target):
result = []
hashtable = {}
for i in range(len(nums)):
hashtable[str(nums[i])] = i
for j in range(len(nums)):
tmp = str(target - nums[j])
if tmp in hashtable.keys() and hashtable[tmp] != j:
result.append(j)
result.append(hashtable[tmp])
return sorted(result)
2.Remove Duplicates from Sorted Array [108ms]
#思路1:j代表已经确实符合题目的索引,更新前自增
class Solution(object):
def removeDuplicates(self, nums):
if len(nums) == 0 :
return 0
length = 1
j = 0
for i in range(1, len(nums)):
if nums[j] != nums[i]:
j += 1
length += 1
nums[j] = nums[i]
return length
3.Remove Duplicates from Sorted Array II [82ms]
#方法1:index表示符合条件的下一个索引,未确认的
#因为最多重复两次
#如果和{index-2}相同则为重复元素,索引不动等待替代
#如果不同,则把{i}和{index}交换
class Solution(object):
def removeDuplicates(self, nums):
if len(nums) <= 2:
return len(nums)
index = 2
for i in range(2, len(nums)):
if nums[i] != nums[index-2]:
nums[index] = nums[i]
index += 1
return index
4.Search in Rotated Array [62ms]
#方法1:虽然是旋转的数组,但是两边肯定有一边是正序的
#平时的二分只需要判断中间的元素,这里多一布判断左右那边是正序
#high刚开开始指向的是无效的,后来更新也指向已经搜索过的
#因为while循环里的是不相等条件,如果指向mid-1的话,剩下最后一个元素会不进行搜索
class Solution(object):
def search(self, nums, target):
if len(nums) == 0:
return -1
low = 0
high = len(nums)
while high != low:
mid = int((low + high) / 2)
if nums[mid] == target:
return mid
if nums[low] < nums[mid]:
if nums[low] <= target and target < nums[mid]:
high = mid
else:
low = mid + 1
else:
if nums[mid] < target and target <= nums[high-1]:
low = mid + 1
else:
high = mid
return -1
5.Search in Rotated Array II [52ms]
#Search in Rotated Sorted Array II [52ms]
#方法1:题目和I很像,只不过在判断多了一条相等的情况
#如果相等只能low+1再搜索,因为之前已经判断过相等的情况了
#还有就是当剩下两个元素时,mid是指向后面一个元素的
class Solution(object):
def search(self, nums, target):
low = 0
high = len(nums)
while low != high:
mid = int((low + high) / 2)
if nums[mid] == target:
return True
if nums[low] < nums[mid]:
if nums[low] <= target and target < nums[mid]:
high = mid
else:
low = mid + 1
elif nums[low] == nums[mid]:
low += 1
else:
if nums[mid] < target and target <= nums[high-1]:
low = mid + 1
else:
high = mid
return False
6.Remove Element [48ms]
#Remove Element [48ms]
#方法1:对于删除操作,定义一个遍历变量长度变量
#当找到时,删除和长度减一,遍历变量注意保持不变
#否则遍历变量自增
#方法2:用索引指针,原理跟removeDuplicated类似[64ms]
class Solution(object):
def removeElement(self, nums, val):
length = len(nums)
i = 0
while i < length:
if nums[i] == val:
del nums[i]
length -= 1
else:
i += 1
return length
7.Plus One [52ms]
class Solution(object):
def plusOne(self, digits):
carry = 0
for i in range(len(digits)-1, -1, -1):
if carry == 1:
digits[i] += 1
carry = 0
if i == len(digits) - 1 :
digits[i] += 1
if digits[i] >= 10:
digits[i] -= 10
carry = 1
if carry == 1:
digits.insert(0, 1)
return digits