算法-1.两数之和

48 阅读1分钟
  1. 两层循环
var twoSum = function(nums, target) {
   for(let i=0;i<nums.length;i++){
    for(let j = i+1; j<nums.length;j++){
        if(nums[i]+nums[j] == target){
            return [i,j]
        }
    }
   }
};
O(n2)
  1. 一层循环 + 二分查找
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
   // 先给数组排序,记住原来位置
   let arr = nums.map((item, index) => ({value: item, index:index}));
   arr.sort((i,j)=>i.value-j.value);
   // O(n)
   for(let i = 0;i<nums.length; i++){
     let left = i + 1; //[left, right);
     let right = nums.length;
     const t = target - arr[i].value; //要查找的数
     // 二分查找 O(log n)
     while(left < right){
        const mid = Math.floor((left + right) / 2);
        if(t == arr[mid].value){
            return [arr[i].index, arr[mid].index]
        }else if(arr[mid].value < t){
            left = mid+1;
        }else{
            right = mid;
        }
     }
   }
};
  1. map 哈希表
O(n)
var twoSum = function(nums, target) {
  const map = new Map();
  for(let i = 0; i < nums.length; i++){
    map.set(nums[i], i)
  }
  for(let i = 0; i<nums.length; i++){
    const t = target - nums[i];
    if(map.has(t)){
        if( i != map.get(t)){
            return [i, map.get(t)]
        }
    }
  }
};