滑動視窗專題

frostjsy發表於2020-11-10

1、滑動視窗要素

雙向指標,條件判斷,暴力求解

2、模板

 

3、例項

167. 兩數之和 II - 輸入有序陣列

給定一個已按照升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。

函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。

說明:

返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例:

輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。

題解:雙向指標

一個指標指向開頭,一個指標指向結尾,如果a[l]+a[r]==target,返回[l+1,r+1];如果a[l]+a[r]<target,l+=1;如果a[l]+a[r]>target,r+=1

def f(a,target):
    l,r=0,len(a)-1
    while(l<r):
        s=a[l]+a[r]
        if(s==target):
            return [l+1,r+1]
        elif(s<target):
            l+=1
        else:
            r-=1
    return [-1,-1]

88. 合併兩個有序陣列

給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為一個有序陣列。

說明:

初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
 

示例:

輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

輸出:[1,2,2,3,5,6]

題解:

設定3個指標i,j,k,分別用i,j從後往前遍歷nums1,nums2,k指標記錄需要寫入的位置

如果nums1[i]>nums2[j],nums1[k]=nums1[i],i-=1;否則nums1[k]=nums2[j],j-=1;k-=1

def f(a,b,m,n):
    i,j,k=m-1,n-1,m+n-1
    while(i>=0 and j>=0):
        if(a[i]>b[j]):
            a[k]=a[i]
            i-=1
        else:
            a[k]=b[j]
            j-=1
        k-=1
    
    while(j>=0):
        a[k]=b[j]
        j-=1
        k-=1
    return a

26. 刪除排序陣列中的重複項

給定一個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。

示例 1:

給定陣列 nums = [1,1,2], 

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。 

你不需要考慮陣列中超出新長度後面的元素。
示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。

你不需要考慮陣列中超出新長度後面的元素。
 

說明:

為什麼返回數值是整數,但輸出的答案是陣列呢?

請注意,輸入陣列是以「引用」方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。

你可以想象內部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對實參做任何拷貝
int len = removeDuplicates(nums);

// 在函式裡修改輸入陣列對於呼叫者是可見的。
// 根據你的函式返回的長度, 它會列印出陣列中該長度範圍內的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

題解:

設定兩個指標i,j;i記錄沒有重複的數的位置,j向前遍歷,直到遍歷到陣列的最後一個位置。

def f(a):
    i,j=0,1
    while(j<len(a)):
        if(a[j]!=a[i]):
            i+=1
            a[i]=a[j]
        j+=1
    return i+1

nums = [0,0,1,1,1,2,2,3,3,4]
r=f(nums)
print(nums[0:r])

 

相關文章