例如,如果我傳遞數字10和數組[1, 2, 4, 4]
函數應該如果數組是[4,2,1,1]
函數應返回false,因爲總和不在2個數之間。遍歷數組並找到數字範圍之間的和
回答
我會解決它像這樣沒有遞歸,只是遍歷元素和未來的人,一旦找到一個解退出循環:
function solution(n, arr) {
if (n < 0) return null;
if (n === 0) return [];
for (var i = 0; i < arr.length; i++) {
var first = arr[i]; // first addend
for (var j = i + 1; j < arr.length; j++) { // considering only next elements in the array
if (first + arr[j] === n) {
console.log(`found solution with ${first} and ${arr[j]}`);
return true;
}
}
}
console.log('no solution found');
return false;
}
console.log(solution(8, [4, 3, 45, 2, 5, 3]));
console.log(solution(8, [-1, 2, 3, 4]));
天真執行檢查兩個數字的總和是嵌套循環,見下面:
function isSumInArray(sum, array) {
for (let i=0; i < array.length; i++) {
for (let j=0; j < array.length; j++) {
if (array[i] + array[j] === sum && i !== j) {
return true
}
}
}
return false;
}
有更好的方法來實現這個,b我選擇它是因爲我認爲這是最簡單的理解。你在這裏經過兩次數組,如果這兩個數字等於你想要的總和(並且它們不是數組中的相同數字),則返回true。如果沒有任何組合滿足此條件,則返回false。
您可以在i + 1而不是0處開始j,以避免重複,例如:[1,2,3,4],當您使用2檢查1時,不需要再次檢查2。 –
使用#some
和#find
功能檢查,如果任意兩個數字的給定數組中的總和等於傳遞的參數 - 見演示如下:
function solution(num, array) {
return array.some(function(e, i) {
return (num - e + array.find(function(c, k) {
return c == e && i != k
})) == num;
});
}
console.log(solution(8, [-1, 2, 3, 4]), solution(8, [-1, 4, 3, 4]), solution(8, [4,3,45,2,5,3]));
在陣列中的任何拖數
function test(array , n)
{
for(var i=0;i<array.length;i++)
{
for(var j=0;j<array.length ; j++)
if(array[i] + array[j] == n && i != j)
return true;
}
return false;
}
var array = [1,2,3,4,2];
console.log(test(array , 1));
console.log(test(array , 4));
對於每個元素,您需要對所有其他元素進行「數學運算」以查看它們是否正確相加。
最簡單的實現是嵌套循環O(N^2)。
僞代碼:
def solution(list, target)
for each element e1 in list
for each element e2 in list
if e2 is e1
continue
end if
if e1 + e2 is target
return true
end if
loop
loop
return false
end def
代碼:
function solution(list, target) {
for(let i = 0; i < list.length; i++) {
const e1 = list[i];
for(let j = 0; j < list.length; j++) {
const e2 = list[j];
if(i === j) { continue; }
if(e1 + e2 === target) {
return true;
}
}
}
return false;
}
console.log(solution([1,2,3,4,5], 2));
下一個簡單的解決方案是要認識到除(即,求和操作)是可交換的。這意味着操作數的順序並不重要。 1 + 2與2 + 1相同。這意味着我們不需要重新計算我們已經在外部循環中訪問過的數字的總和,因爲當我們前進時,我們計算a + b的總和,因此按照定義覆蓋b + a。雖然總體複雜性保持不變:O(N^2)(AFAICT)。
僞代碼:
def solution(list, target)
for each element e1 in list
for each element e2 that is to the right of e1 in list
if e1 + e2 is target
return true
end if
loop
loop
return false
end def
代碼:
function solution(list, target) {
for(let i = 0; i < list.length; i++) {
const e1 = list[i];
for(let j = i+1; j < list.length; j++) {
const e2 = list[j];
if(e1 + e2 === target) {
return true;
}
}
}
return false;
}
console.log(solution([1,2,3,4,5], 5));
一個更好的解決方案是將兩個事實結合起來,添加是可交換的,我們知道要尋找什麼,而不不得不第二次實際枚舉列表。即如果a
是當前元素,那麼我們知道我們想要a + x = target
,所以x
可以很容易地計算(這是差異)。通過使用O(1)查找數據結構,我們可以替換內部循環,並使算法O(N)整體。
要重新說明問題,列表中的每個元素必須與左側的所有元素以及右側的所有元素相加。當我們向外循環前進時,我們對所有右手元素進行求和(因爲加法的交換性)。隨着循環的進展,元素右側的所有元素最終都將隨着它進行測試。
爲了總結左邊的所有元素,我們可以用已經看到的元素索引的哈希表替換內部循環。然後我們可以使用這樣的事實a + x = target
,因此,x = target - a
檢查散列表中存在x
。
僞代碼:
def solution(list, target)
var hash <- hashtable: [integer:boolean]
for each element in list
if hash has sum-element
return true
else
add element to hash
endif
loop
end def
代碼:
function solution(list, target) {
const hash = new Set;
for(let e of list) {
if(hash.has(target-e)) {
return true;
}
hash.add(e);
}
return false;
}
solution([1,2,3,4,5], 3);
- 1. 遍歷範圍
- 2. 如何遍歷數組,並在$範圍顯示它(angularjs)
- 3. 遍歷Excel範圍
- 4. 循環遍歷數組並找到部分字符串
- 5. 遍歷範圍並找到空單元格
- 6. 如何遍歷對象並匹配對象中數字範圍內的數字?
- 7. 找到兩個數字之間的範圍(objective-c)
- 8. PHP使用數組找到範圍和失蹤數字
- 9. 遍歷數組並插入到websql
- 10. MYSQL範圍之間的數字列表
- 11. 遍歷字符串數組
- 12. 遍歷字符串數組
- 13. 在列中遍歷範圍
- 14. Puppet遍歷給定的數字範圍與每個功能
- 15. 遍歷數組
- 16. 遍歷數組
- 17. 遍歷數組
- 18. 遍歷數組
- 19. 遍歷數組
- 20. 遍歷數組
- 21. 遍歷數組
- 22. 遍歷數組
- 23. 遍歷數組
- 24. 遍歷對象文字和數組
- 25. 同時遍歷字典和numpy數組
- 26. 遍歷範圍向前和向後 - Python
- 27. 循環遍歷範圍,行和列
- 28. 角:深範圍遍歷和更新
- 29. 找到100的範圍和他們的計數之間的數值
- 30. 遍歷數組和PHP
任何兩個數字,或兩個相鄰的數字?另外,遞歸是一個要求嗎? – mhodges
任何兩個@mhodges –
我們可以通過確定如何得出正確答案來獲得答案嗎?另外,我想指出你的函數應該只返回一個'type'。如果我使用這個,我期望一個布爾值被返回,而不是null或一個數組。 – Stephen