1. 程式人生 > >python_lintcode_397最長上升連續子序列_56兩數之和

python_lintcode_397最長上升連續子序列_56兩數之和

397最長上升連續子序列

題目

給定一個整數陣列(下標從 0 到 n-1, n 表示整個陣列的規模),請找出該陣列中的最長上升連續子序列。(最長上升連續子序列可以定義為從右到左或從左到右的序列。)

注意事項

time

樣例
給定 [5, 4, 2, 1, 3], 其最長上升連續子序列(LICS)為 [5, 4, 2, 1], 返回 4.

給定 [5, 1, 2, 3, 4], 其最長上升連續子序列(LICS)為 [1, 2, 3, 4], 返回 4.

思路

  1. if a<=2:return a
  2. 先判斷陣列的第一個元素和第二個元素之間的關係是越來越大還是越來越小(此處定義為0 or 1),此處連續子序列已經至少有兩個,即sum=2
  3. 對後面的陣列元素進行判斷,滿足一開始的關係(0 or 1),sum+1,直到關係發生改變(0->1 or 1->0),比較存放最大次數的comp和sum,將最大值放於sum.
  4. 迴圈3,直到讀取到最後一個元素
  5. return comp

程式碼

class Solution:
    """
    @param: A: An array of Integer
    @return: an integer
    """
    def longestIncreasingContinuousSubsequence(self, A):
        # write your code here
a=len(A) if a<=2:return a #b=0 越來越大,b=1 越來越小 b=0 if A[0]>A[1]:b=1 #sum存放每次出現連續的次數,comp存放最大的連續次數 sum=2 comp=0 for i in range(2,a): #連續情況 if A[i]>A[i-1] and b==0 or A[i]<A[i-1] and b==1: sum+=1
#出現沒有連續,所有初始化,並判斷是否改變comp if A[i]>A[i-1] and b==1 or A[i]<A[i-1] and b==0: if comp<sum:comp=sum sum=2 #b=0 越來越大,b=1 越來越小 b=0 if A[i-1]>A[i]:b=1 #可能出現最長上升連續子序列連續到最後一個元素,需要將此次與之前的最大的連續次數判斷 if comp<sum:comp=sum return comp

56兩數之和

題目

給一個整數陣列,找到兩個數使得他們的和等於一個給定的數 target。

你需要實現的函式twoSum需要返回這兩個數的下標, 並且第一個下標小於第二個下標。注意這裡下標的範圍是 1 到 n,不是以 0 開頭。

注意事項

你可以假設只有一組答案。

樣例
給出 numbers = [2, 7, 11, 15], target = 9, 返回 [1, 2].

思路

  • 此列表都是按升序排好的
  • 本結果可多個,只需返回一組即可
    1. 選取列表liat1的第一個元素A,然後再去建立新的除了該元素之外的列表list2,判斷target-A是否在新的列表,沒有則取list2x下一個元素B
    2. 迴圈1,直到找到滿足要求的兩個數字
    3. 找到之後,所以第一個數字在list1為i,第二個數字是在list2的位置j,轉化在list1的位置,應該j+i+1,即[i,j+i+1]
    4. 因為列表都是從0開始的,而題目要求的下標的範圍是 1 到 n,不是以 0 開頭,結果應該為[i+1,i+j+2]
目標數字為6: 可以為1+5
list1:123456789
位置 :012345678
第一個 i=01除去,得到新的列表list2
list2:23456789
位置 :01234567
第二個 j=3

在list1的位置 4=j+i+1[0,4]
結果 [1,5]

程式碼

class Solution:
    """
    @param numbers : An array of Integer
    @param target : target = numbers[index1] + numbers[index2]
    @return : [index1 + 1, index2 + 1] (index1 < index2)
    """
    def twoSum(self, numbers, target):
        # write your code here
        if len(numbers)<2:return []
        a=len(numbers)
        #從第一個數字到a-1,因為第a個不需要找,沒有第二個數給他相加
        for i in range(a-1):
            j=target-numbers[i]
            if j in numbers[i+1:]:
                #返回滿足條件的下標,此下標是在新的列表的下標,需要+前面數
                i2=numbers[i+1:].index(j)+i+2
                return [i+1,i2]
        return []