簡體   English   中英

對於用戶輸入 n,並且 1<=i

[英]For a user input n, and 1<=i<j<=n, find the number of pairs where i*i*i=j*j using python

For a user input n, and 1<=i<j<=n, find the number of pairs where i*i*i=j*j using python

程序需要從用戶那里獲取輸入,如果用戶輸入是 50,輸出應該是 3,因為有 3 個這樣的對:(1,1), (4,8), (9,27) 使用 python。

def solution(n):
    count=0
    for i in range(1,n):
       for j in range(i,n):
          if (i**3==j*j):
             count+=1
    return count
n=int(input())
out=solution(n)
print(out)

這是我寫的函數。 它有效,但在我正在練習的站點中,它超時並要求我進一步優化它。 我能做什么?

您可能不會計算找到匹配項的次數,而是保存索引:

def solution(n):
    result = []
    for i in range(1, n):
        for j in range(i, n):
            if i ** 3 == j ** 2:
                result.append((i, j))
    return result

# with list comprehension
def solution(n):
    return [(i, j) for i in range(1, n) for j in range(i, n) if i ** 3 == j ** 2]

優化

通過查看值,您可以確定哪些值可以匹配,以獲得i**2 == j**3 t=you need i = x**3j = x**2所以一個循環就足夠了:

def solution(n):
    result = []
    for i in range(1, ceil(n ** (1 / 3))):
        result.append((i ** 2, i ** 3))
    return result

# with list comprehension
def solution(n):
    return [(i ** 2, i ** 3) for i in range(1, ceil(n ** (1 / 3)))]

作為一名程序員不應該阻止與計算機保持一分鍾的距離並思考數學問題。 由於整數可以被分解為質因數的乘積,因此 i 和 j 必須共享相同的質因數,並且對於這些質因數中的每一個,該等式都成立。 但是對於質因數,很明顯你需要有一個公數 k,其中:k 2 = i 和 k 3 = j。

所以問題可以簡化為找到所有數字 k,k >= 1 和 k 3 <= n。 如果你需要的話,i,j 對就是 k 2 , k 3

一個簡單的方法是:

def solution(n)
    count = 0
    for i in range(n):
        if i * i * i * i * i * i <= n:
            count += 1
        else:
            break
    return count

用一個循環。

但是你可以猜測結果會接近 n 1/6 ,這將立即導致結果:

def solution(n):
    def i6(i):
        j = i *i * i
        return j * j
    i = int(n ** (1./6))
    if (i == 0): return 1 # should never occur but floating point
                          #  inaccuracy can give WEIRD results
    if i6(i) > n:
        return i - 1  # still floating point inaccuracy
    if i6(i+1) <= n:      # over convervative
        return i + 1
    return i

無論 n 的值是多少,只有 3 次測試,至少最多 2 48 (雙精度值的尾數大小)

檢查三元組數量的最佳方法(小於 O(n^2) )其中 a[k] <a[i]<a[j] for all i<j<k in an array< div><div id="text_translate"><p> 我正在解決一個問題,我必須在數組中找到 Ai、Aj 和 Ak 三元組的數量,使得 Ak &lt; Ai &lt; Aj 和 i &lt; j &lt; k。 我知道來自<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">https://www.geeksforgeeks.org/count-of-triplets-in-an-array-ijk-such-that-ijk-</a>的時間復雜度 O(n^2) 和 O(n^3) 代碼<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">and-ak-ai-aj/</a>來做到這一點... O(n^3) 時間復雜度代碼:</p><pre> def CountTriplets(arr, n): cnt = 0; for i in range(0, n): for j in range(i + 1, n): for k in range(j + 1, n): # If it satisfy the # given conditions if (arr[k] &lt; arr[i] and arr[i] &lt; arr[j]): cnt += 1; # Return the final count return cnt; # Driver Code # Given array arr[] arr = [ 2, 5, 1, 3, 0 ]; n = len(arr); # Function Call print(CountTriplets(arr, n))</pre><p> 和 O(n^2) 時間復雜度代碼:</p><pre> # Function to count triplets def CountTriplets(a, n): # To store count # of total triplets ans = 0 for i in range (n): # Initialize count to zero cnt = 0 for j in range (i + 1, n): # If a[j] &gt; a[i] then, # increment cnt if (a[j] &gt; a[i]): cnt += 1 # If a[j] &lt; a[i], then # it mean we have found a[k] # such that a[k] &lt; a[i] &lt; a[j] else: ans += cnt # Return the final count return ans # Driver code if __name__ == "__main__": arr = [2, 5, 1, 3, 0] n = len(arr) print (CountTriplets(arr, n))</pre><p> 我認為這個問題可以用小於 O(n^2) 的時間復雜度來解決。</p><p> 我看到這個具有挑戰性的問題由 50 人在本地(非英語)網站上以小於 O(n^2) 的時間復雜度解決,但我們看不到解決方案。 </p></div></a[i]<a[j]>

[英]Optimal way ( less than O(n^2) ) to check for number of triplets where a[k]<a[i]<a[j] for all i<j<k in an array

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 查找對 (i,j) 的數量,使得 i &lt; j 且 A[i] &gt;= 2A[j] 考慮一個由整數A = [a1,a2,a3 ... an]組成的數組n。 查找並打印對的總數,以使ai * aj &lt;= max(ai,ai + 1,…aj)其中i &lt;j 檢查三元組數量的最佳方法(小於 O(n^2) )其中 a[k] <a[i]<a[j] for all i<j<k in an array< div><div id="text_translate"><p> 我正在解決一個問題,我必須在數組中找到 Ai、Aj 和 Ak 三元組的數量,使得 Ak &lt; Ai &lt; Aj 和 i &lt; j &lt; k。 我知道來自<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">https://www.geeksforgeeks.org/count-of-triplets-in-an-array-ijk-such-that-ijk-</a>的時間復雜度 O(n^2) 和 O(n^3) 代碼<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">and-ak-ai-aj/</a>來做到這一點... O(n^3) 時間復雜度代碼:</p><pre> def CountTriplets(arr, n): cnt = 0; for i in range(0, n): for j in range(i + 1, n): for k in range(j + 1, n): # If it satisfy the # given conditions if (arr[k] &lt; arr[i] and arr[i] &lt; arr[j]): cnt += 1; # Return the final count return cnt; # Driver Code # Given array arr[] arr = [ 2, 5, 1, 3, 0 ]; n = len(arr); # Function Call print(CountTriplets(arr, n))</pre><p> 和 O(n^2) 時間復雜度代碼:</p><pre> # Function to count triplets def CountTriplets(a, n): # To store count # of total triplets ans = 0 for i in range (n): # Initialize count to zero cnt = 0 for j in range (i + 1, n): # If a[j] &gt; a[i] then, # increment cnt if (a[j] &gt; a[i]): cnt += 1 # If a[j] &lt; a[i], then # it mean we have found a[k] # such that a[k] &lt; a[i] &lt; a[j] else: ans += cnt # Return the final count return ans # Driver code if __name__ == "__main__": arr = [2, 5, 1, 3, 0] n = len(arr) print (CountTriplets(arr, n))</pre><p> 我認為這個問題可以用小於 O(n^2) 的時間復雜度來解決。</p><p> 我看到這個具有挑戰性的問題由 50 人在本地(非英語)網站上以小於 O(n^2) 的時間復雜度解決,但我們看不到解決方案。 </p></div></a[i]<a[j]> 找到所有三元組 i,j,k 使得 i+j+k=n 優化代碼以查找沒有成對的索引 (i,j) 使得 i&lt;=j 和 (a[i] +a [j]) 是 2 的和 如何使用 python 制作 N×N 矩陣,其中每個 a(i,j) 的值已知? 在i和j python之間生成n個隨機數 用n表示具有整體A i,j的nxn數組:= sin(zi,j)其中zi,j是(0,2pi]中均勻分布的隨機數 我和j相當於python 如何有效地為 [N] 中的每個 i, j 計算 score = dot(a, LeakyReLU(x_i+y_j)) ?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM