今天開(kāi)始進(jìn)行為期兩個(gè)月的代碼隨想錄刷題,并在此更新我的做題記錄,也期望博客能成為我記錄學(xué)習(xí)的一個(gè)好習(xí)慣。
第一章為數(shù)組,也叫做順序表,它的最大特點(diǎn)就是順序存儲(chǔ)且地址連續(xù)。
第一道題為二分查找,該方法只適用于數(shù)組中元素的大小有序的情況下,基本原理大概為:當(dāng)給定一個(gè)數(shù)組以及一個(gè)所需要查找的數(shù)字時(shí),先取數(shù)組最中間的元素即下標(biāo)為1/2這樣的時(shí)候,先與之對(duì)比。以升序?yàn)槔绻虚g的元素比所查找的元素大,那么就將查找區(qū)間轉(zhuǎn)為該下標(biāo)的右邊部分,反之則查找左邊部分。
談?wù)剬?shí)現(xiàn),由于我是算法菜鳥(niǎo),因此我并不報(bào)僅靠自己就可以實(shí)現(xiàn)算法的期望,正如我常說(shuō)的,我是一個(gè)庸才,但我仍然想重復(fù)天才已給出的財(cái)富,在此之上不斷重復(fù)以期望找尋自己的創(chuàng)新。扯遠(yuǎn)了,我們需要一前一后兩個(gè)指針,這樣才可以方便找到數(shù)組中間的位置,在這里還要注意邊界問(wèn)題。go語(yǔ)言版本如下:

func search(nums []int,target int) int {
      left:=0 //左邊界
      right:=len(nums) -1 //右邊界
     for left <= right {
        mid:=left + (right - left)>>1
        if target == nums[mid] {
           return mid
}else if target > nums[mid] {
         left = mid + 1
}else{
         right = mid -1
}
}
return -1 //這里為異常情況
}

python版本如下,這里仍然需要邊界注意,此時(shí)為左閉右開(kāi):

def search(self,nums:List[int],target:int)-> int:
    left,right=0,len(nums)
    while left < right:
        mid = left + (right -left) //2
        if target > nums[mid]:
            left = mid +1
        elif target < nums[mid]:
            right = mid 
        else:
            return mid
    return -1

緊接著是移除元素,我們需要對(duì)一個(gè)數(shù)組原地查找等于給定數(shù)值val的數(shù)值并原地刪除最后輸出不同于所查找值的數(shù)量,這里先演示暴力解法,即兩個(gè)for循環(huán),一個(gè)用以便利所有元素,并在第一層for循環(huán)中使用判斷語(yǔ)句篩選條件后再嵌套一個(gè)for循環(huán)對(duì)元素進(jìn)行重新排序,這里演示go語(yǔ)言的版本:

func removeElement(nums []int, val int) int {
     size:=len(nums)
     for i:=0;i<size;i++{
        //從0開(kāi)始遍歷故此時(shí)一定是第一個(gè)出現(xiàn)的val,因此j從i+1開(kāi)始來(lái)找到另外的val
        if nums[i] == val{
            for j:=i+1;j<size;j++{
                nums[j-1] = nums[j]
            }
           i--
           size-- 
        }
     }
     return size
}

python的版本則同理:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i = 0
        l = len(nums)
        while i < l:
            if nums[i] == val:
                for j in range(i+1,l):
                    nums[j-1] = nums[j]
                l-=1
                i-=1
            i+=1
        return l

這里再演示一個(gè)快慢指針?lè)?使用python實(shí)現(xiàn):

def remove(self,nums:List[int] ,val int) -> int:
    slow=0
    fast=0
    size=len(nums)
    while fast<size:
        if nums[fast] != val:
            nums[slow] = nums[fast]
            slow+=1
        fast+=1
    return slow
func removeElement(nums []int, val int) int {
    slow:=0
    fast:=0
    size:=len(nums)
    for i:=0;i<size;i++{
        if nums[fast] != val{
            nums[slow] = nums[fast]
            slow++
        }
        fast++
    }
    return slow

}

所謂快慢指針?lè)ǎ豢煲粷M指針同時(shí)從起點(diǎn)出發(fā),快指針先行出發(fā),在遍歷的途中,如果有不等于所查找的值的,慢指針?biāo)淼闹稻团c之交換并位置進(jìn)一,同時(shí)快指針繼續(xù)遍歷,最終找到數(shù)量就是slow慢指針的值