數據結構與算法六(查找排序練習)

1.給兩個字符串s和t,判斷t是否爲s的重新排列後組成的單詞
s=“anagram”,t=“nagaram”,return true
s=“rat”,t=“car”,return false

#排序的寫法,時間複雜度爲O(nlogn)
def isAnagram(s,t):
    ss=list(s)
    tt=list(t)
    ss.sort()
    tt.sort()
    if ss==tt:
        return True
    else:
        return False
s="anagram"
t="nagaram"
isAnagram(s,t)

s="rat"
t="car"
isAnagram(s,t)
#只要s和t中相應字母的個數相同則返回True,否則返回False
時間複雜度爲O(n)
def isAnagram(s,t):
    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
    if dict1==dict2:
        return True
    else:
        return False
s="rat"
t="car"
isAnagram(s,t)

2.給定一個m*n的二維列表,查找一個數是否存在。列表有下列特性:
(1)每一行的列表從左到右已經排序好。
(2)每一行第一個數比上一行最後一個數大。
在這裏插入圖片描述

#線性查找
#時間複雜度爲O(mn)(m、n表示列表的行數和列數)
def searchMatrix(matrix,target):
    for line in matrix:
        if target in line:
            return True
    return False

matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]
searchMatrix(matrix,100)
#二分查找
#時間複雜度爲O(logn)(n表示二維列表的元素個數)
def searchMatrix(matrix,target):
   if h==0:
        return False
    w=len(matrix[0])#列表的列數
    if w==0:
        return False
    left=0
    right=h*w-1
    '''
    0  1  2  3 
    4  5  6  7
    8  9  10  11
    h=3,w=4
    中間位置的座標i=mid//4 j=mid%4
    '''
    while left<=right:#說明左邊有數
        mid=(left+right)//2
        i=mid//4
        j=mid%4
        if matrix[i][j]==target:
            return True
        elif matrix[i][j]<target:
            left=mid+1
        else:
            right=mid-1
    else:
        return False
  
matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]
searchMatrix(matrix,11)   

3.給定一個列表和一個整數,設計算法找到兩個數的下標,使得兩個數之和爲給定的整數。保證肯定僅有一個結果。
例如,列表[1,2,5,4]與目標整數3,1+2=3,結果爲(0,1)

def twoSum(nums,target):
    n=len(nums)
    for i in range(n):
        for j in range(i):#和前邊的元素比較
            if nums[i]+nums[j]==target:
                return sorted([i,j])
li=[1,2,5,4]
twoSum(li,7)
#已知一個數,找另一個數
 #利用二分查找找b,假設列表是有序的,利用二分查找
class Solution:
 def binary_search(self,li,left,right,val):
    while left<=right:#表明左邊有數
        mid=(left+right)//2
        if li[mid]==val:
            return mid
        elif li[mid]<val:#待查找的值在mid右側
            left=mid+1
        else:#待查找的值在mid左側
            right=mid-1
    else:
        return None
    
def twoSum(self,nums,target):
    n=len(nums)
    for i in range(n):
        a=nums[i]
        b=target-a
        if b>=a:
            j=self.binary_search(nums,i+1,n-1,b)
        else:
            j=self.binary_search(nums,0,i-1,b)
   
li=[1,2,4,5]
a=Solution()
a.twoSum(li,7)       
#列表是無序的
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右側
            left=mid+1
        else:#待查找的值在mid左側
            right=mid-1
    else:
        return None
    
 def twoSum(self,nums,target):
    new_nums=[[num,i] for i,num in enumerate(nums)]
    new_nums.sort(key=lambda x:x[0])
    n=len(new_nums)
    for i in range(n):
        a=new_nums[i][0]
        b=target-a
        if b>=a:
            j=self.binary_search(new_nums,i+1,n-1,b)
        else:
            j=self.binary_search(new_nums,0,i-1,b)
    return sorted([new_nums[i][1],new_nums[j][1]])
   
li=[6,3,1,7,2]
a=Solution()
a.twoSum(li,10)       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章