算法之:练习题
一、重排列

方法一:
class Solution:
def isAnagram(self,s,t):
"""
:param s: str
:param t: str
:return: bool
"""
dict1 = {} #{'a':1,'b':2}
dict2 = {}
for ch in s:
dict1[ch] = dict1.get(ch,0) + 1
for ch in t:
dict2[ch] = dict2.get(ch,0) + 1
return dict1 == dict2
方法二:
class Solution:
def isAnagram(self, s, t):
"""
:param s: str
:param t: str
:return: bool
"""
return sorted(list(s)) == sorted(list(t))
二、二维二分查找

方法一:
class Solution:
def searchMatrix(self, matrix, target):
"""
:param matrix: List[List[int]]
:param target: int
:return: bool
"""
#[[],[],[]]
m = len(matrix) # 行数
if m == 0:
return False
n = len(matrix[0]) #列数
if n == 0:
return False
low = 0
high = m * n - 1
while low <= high:
mid =(low + high) // 2
x,y = divmod(mid,n)
if matrix[x][y] > target:
high = mid - 1
elif matrix[x][y] < target:
low = mid + 1
else:
return True
else:
return False
方法二:
class Solution:
def searchMatrix(self, matrix, target):
if not matrix or target is None:
return False
rows,cols = len(matrix), len(matrix[0])
low, high = 0,rows * cols - 1
while low <= high:
mid = (low + high) / 2
num = matrix[mid / cols][mid % cols]
if num == target:
return True
elif num < target:
low = mid + 1
else:
high = mid + 1
return False
三、 Two Sum
1、题目描述

2、方法一
class Solution:
def binary_search(self,li,left,right,val):
while left <= right: #候选区有值
mid = (left + right) // 2
if li[mid][0] == val:
return mid
elif li[mid][0] > val: #待查找的值在mid左侧
right = mid - 1
else: #li[mid]< val 待查找的值在mid右侧
left = mid + 1
else:
return None
def twoSum(self,nums,trarget):
"""
:param self:
:param nums: List[int]
:param trarget: int
:return:
"""
new_nums = [[num,i] for i,num in enumerate(nums)]
new_nums.sort(key = lambda x:x[0])
for i in range(len(new_nums)):
a = new_nums[i][0]
b = trarget - a
if b >= a:
#print(b,i+1,len(nums)-1)
j = self.binary_search(new_nums,i+1,len(nums)-1,b)
else:
j = self.binary_search(new_nums, 0, i - 1, b)
if j:
return sorted([new_nums[i][1],new_nums[j][1]])
3、方法二
def twoSum(self,nums,trarget):
"""
:param self:
:param nums: List[int]
:param trarget: int
:return: List[int]
"""
#[1,4,6,7,9,3], 9
#{1:0,4:1,6:2,7:3,9:4}
d = {}
for i in range(len(nums)):
a = nums[i]
b = trarget - a
if b in d:
return [d[b],i]
else:
d[a] = i
https://leetcode.com/problems/two-sum/description/
四、区域查询


方法一:
def find_a(nums,target):
low = 0
high = len(nums) - 1
while low <= high:
mid = (low + high) // 2
if target <= nums[mid]:
high = mid - 1
else:
low = mid + 1
#[1,2,3,2,4,8,10]
if low < len(nums):
return low
else:
return -1
def find_b(nums,target):
low = 0
high = len(nums) - 1
while low <= high:
mid = (low + high) // 2
if target < nums[mid]:
high = mid - 1
else:
low = mid + 1
if low < len(nums):
return low
else:
return -1
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

浙公网安备 33010602011771号