算法题

129 阅读1分钟

最接近的三数之和

采用排序加双指针解法:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
      nums = nums.sort((a,b)=>{
          return a-b;
      })

      let resultSum = 1000000;
      for(let i=0;i<nums.length;i++){
          if(i >0 && nums[i]===nums[i-1]){
              continue;
          }

          let j = i+1;
          let k = nums.length-1;
          while(j<k){
              let sum = nums[i]+nums[j]+nums[k];
              if(sum===target){
                  return sum;
              }
              if(Math.abs(sum-target)<Math.abs(resultSum-target)){
                  resultSum = sum;
              }

              if(sum-target>=0){
                  let k0 = k-1;
                  while(k0>j && nums[k0]===nums[k0+1]) {
                      k0--;
                  }

                  k = k0;
              }

              if(sum-target<0){
                  let j0 = j+1;
                  while(j0<k && nums[j0]===nums[j0-1]){
                      j0++;
                  }
                  j= j0;
              }

          }
      }

      return resultSum;
};

判断数组是否有重复数字

这是最开始想到的算法,也可以使用排序,然后循环一次进行两个数字比较

var containsDuplicate = function(nums) {
    if([...new Set(nums)].length != nums.length){
        return true;
    } else {
        return false;
    }
};

使用排序再比较,然后循环可以用哈希表进行一次循环即可

var containsDuplicate = function(nums) {
   let obj = {};
   for(let i=0;i<nums.length;i++){
       if(obj[nums[i]]) {
           return true;
       } else {
           obj[nums[i]] = true;
       }
   }
   return false;
};

相对名次

最开始使用的是:

var findRelativeRanks = function(score) {
    const ward = ["Gold Medal","Silver Medal","Bronze Medal"]
    const score2= JSON.parse(JSON.stringify(score)).sort((a,b)=>b-a);
    const obj = {};
    const result = [];
    for(let i=0;i<score2.length;i++){
      obj[score2[i]] = i+1;
    }

    for(let j=0;j<score.length;j++){
        const val = obj[score[j]]
        if(val<4) {
            result.push(ward[val-1]);
        } else {
            result.push(val.toString())
        }
    }
    return result;
};

可以直接用数组下标也可以,也是一遍循环,但是可能开辟的数组空间会比较大,代码如下:

var findRelativeRanks = function(score) {
    const temp = [];
    for (let i = 0; i < score.length; i++) {
        temp[score[i]] = i;
    }

    console.log(temp)
    let num = 1;
    const result = [];
    for (let j = temp.length - 1; j >= 0; j--) {
        if (temp[j] != undefined) {
            if (num<=3) {
                console.log(num)
                console.log(temp[j])
                console.log(  ['Gold Medal', 'Silver Medal', 'Bronze Medal'][num - 1])
            
                result[temp[j]] =  ['Gold Medal', 'Silver Medal', 'Bronze Medal'][num - 1]
            
            } else {
                result[temp[j]] = num + '';
            }
            num++;
        }
    }

    return result;
};