題目:給定乙個整數陣列,在該陣列中,尋找三個數,分別代表三角形三條邊的長度,問,可以尋找到多少組這樣的三個數來組成三角形?
樣例 例如,給定陣列 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...