JS算法 javascript兩數(shù)之和(從龜速到最速)

方法 1 暴力雙for循環(huán)
用兩個for循環(huán)來進行操作,優(yōu)點是如果沒接觸過的話可能第一時間想到用這個方法,缺點是耗時太長,而且時間復雜度為O(n^2),不推薦使用

var twoSum = function(nums, target) {
                let arr = nums;
                let arrs = new Array()
                for(let i =  0; i < arr.length ; i++){
                    for(let j = 0; j < arr.length; j++){
                        if (( i!=j)&&(arr[i] + arr[j] === target)) {
                            arrs.push(i, j)
                            return arrs
                        }
                    }
                }
            }

方法 2 使用Map函數(shù)
創(chuàng)建一個Map(),將要比較的數(shù)組中每個數(shù)所在的位置和數(shù)用Map數(shù)據(jù)結構存儲起來,然后使用for循環(huán)來和map里面的數(shù)據(jù)進行比較,這里要注意一下,因為不能重復使用數(shù)組里面位置相同的數(shù)字,必須要對比一下map里面存儲的位置與當前比較的數(shù)字的位置是否相同

var twoSum = function(nums, target) {
    let map = new Map();
    let arr = new Array()
    for(let i in nums){
        map.set(
            nums[i],
            i
        )
    }
    
    for(let j = 0; j < nums.length; j++){
        if(map.has( target - nums[j] ) && map.get( target - nums[j]) != j ){
            arr.push( j , map.get( target - nums[j] ) );
            return arr
        }
    }

}

方法 3 邊存邊比較
非常簡潔的一個方法,原理是先創(chuàng)建一個json空數(shù)組,以鍵值對的方式存儲位置和對應的數(shù)字,然后for循環(huán)給的數(shù)組,當前數(shù)字不符合要求就存入json,然后再次比較,直到得到正確答案

var twoSum = function(nums, target) {
   const map = {}
   for (let i = 0; i < nums.length; i++){
       if(map[target - nums[i] ] >= 0){
           return [ map[target - nums[i] ], i]
       }
       map[nums[i]] = i;            
    }

}

方法 3.5 將方法3改成尾遞歸的形勢
執(zhí)行速度比方法3快了40ms左右,記得使用尾遞歸優(yōu)化

var twoSum = function(nums, target, i = 0, maps = {}) {
    const map = maps
        if(map[target - nums[i] ] >= 0 ) {
            return [ map[target - nums[i] ], i]
        } else {
            map[ nums[i] ] = i;
            i++;
            if(i < nums.length){
                return twoSum(nums, target, i, map)
            }else {
                throw 'error: twoSum is not find'
            }
        }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、基礎知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,405評論 0 4
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,268評論 0 4
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,830評論 2 9
  • 雨悄然抵達 草叢的蝸殼如同一把傘 魁拔的灑水車猛然經過 烤饅頭的人,是我 2015/8/18
    奶香味旅途閱讀 224評論 0 4
  • 孩子是一道明晃晃的鏡子,在他的每個成長階段,照見父母。 門前望眼欲穿的父母,見面后最好只聽不說,說只有好奇,鼓勵和...
    夕彥閱讀 41評論 0 0