LintCode python 小白3 三角形計數

2021-08-03 14:45:43 字數 1660 閱讀 2227

題目:給定乙個整數陣列,在該陣列中,尋找三個數,分別代表三角形三條邊的長度,問,可以尋找到多少組這樣的三個數來組成三角形?

樣例 例如,給定陣列 s = ,返回 3

其中我們可以找到的三個三角形為:

給定陣列 s = , 返回 4

第一次思路:

直接遍歷陣列,找出三個數,然後判斷是否滿足三角形條件

滿足三角形的條件有兩種:①任取兩條相加大於第三條和兩條相減小於第三條;②兩兩相加都大於第三邊

由於是要在陣列上面找三條,也就是第一條不可能出現在倒數第二條,及(0,1,2,3,…,n-2,n-1)第一次迴圈範圍0–n-3,但是注意到range的使用是不包括右邊,則i in range(0,n-2),則第二條j in range(i+1,n-1),第三條 z in range(j+1,n).

**如下:

def

********count

(self, s):

# write your code here

if len(s)<3:

return;

count=0;

len1=len(s)

for i in range(0,len1-2):

for j in range(i+1,len(s)-1):

for z in range(j+1,len(s)):

if tri(s[i],s[j],s[z])==1:

print(s[i],s[j],s[z])

count+=1

return count

deftri

(a,b,c):

if a+b>c and a+c>b and b+c>a:

return

1else:

return

0

然而因為三次迴圈,所以導致time limit exceeded。

縮短為兩次迴圈,思路如下:

將輸入的陣列(列表)通過list.sort()進行從小到大的排序。

採用二分法:每次找到最大值和最小值,然後得到他們的差,取他們的中間值判斷與差的大小,來判斷中間值在哪個位置,則該位置到最大值的位置的值都是符合要求的值,將該範圍的數量為滿足條件的count

兩次迴圈,找到所有的count+=count.

return count

**如下:

def

********count

(self, s):

# write your code here

if len(s)<3:

return;

count=0;

s.sort();#從小到大排序

for i in range(0,len(s)):

for j in range(i+1,len(s)):

w,r=i+1,j

target=s[j]-s[i]

while w2

#取整數

s_mid=s[mid]

if s_mid>target:

r=mid

else:

w=mid+1

count+=(j-w)

return count

總結:本題思路比較清晰,要盡量少使用迭代或者遍歷的演算法,很容易出現時間和記憶體的限制。

Lintcode Python之移動零

題目 給乙個陣列 nums 寫乙個函式將 0 移動到陣列的最後面,非零元素保持原陣列的順序。樣例 給出 nums 0,1,0,3,12 呼叫函式之後,nums 1,3,12,0,0 注意事項 1.必須在原陣列上操作 2.最小化運算元 思路 1 移動賦值的話,想到雙指標首尾靠近遍歷,版本一的 出來了 ...

lintcode python 最長公共字串

最長公共字串 問題描述 給出兩個字串,找到最長公共子串,並返回其長度。如下 class solution def longestcommonsubstring self,a,b l if a or b 排除特殊情況 return 0 for i in range len a for j in ran...

Lintcode python之兩陣列的交

返回兩個陣列的交 樣例 nums1 1,2,2,1 nums2 2,2 返回 2 python 的set集合就有交集的操作,而且順帶去重,簡直爽歪歪,直接用set,一行 搞定。class solution param nums1 an integer array param nums2 an int...