JS实现 LeetCode 数组类算法 简单部分(二)

更多算法实现见:https://github.com/Erindcl/Daily-algorithm

88. 合并两个有序数组

  • 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 使得 num1 成为一个有序数组。
  • 说明:
  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

代码如下:

var merge = function(nums1, m, nums2, n) {
   while (n > 0) {
    if (nums1[m - 1] >= nums2[n - 1]) {
      nums1[m + n - 1] = nums1[m - 1]
      m -= 1
    } else {
      nums1[m + n - 1] = nums2[n - 1]
      n -= 1
    }
  }
};

118. 杨辉三角

  • 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
  • 在杨辉三角中,每个数是它左上方和右上方的数的和。

分析:每一行数组的结构:在第 n 行,*arr[0] 和 arr[n -1] 均为 1, arr[i] = 上一行arr[i -1] + 上一行的arr[i]。代码如下:

var generate = function(numRows) {
    if (numRows == 0) {
        return [];
    }
    var resultArr = [];
    for (var i = 0; i < numRows; i++) {
        var currArr = [];
        currArr[0] = 1;
        currArr[i] = 1;
        for (var j = 1; j < i; j++) {
            currArr[j] = resultArr[i-1][j-1] + resultArr[i-1][j];
        }
        resultArr.push(currArr);
    }
    return resultArr;
};

121. 买卖股票的最佳时机

  • 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
  • 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
  • 注意你不能在买入股票前卖出股票。

代码如下:

var maxProfit = function(prices) {
    var minP = prices[0], maxP = 0;
    prices.forEach(function (value,index,arry) {
          minP = Math.min(value,minP);
          maxP = Math.max(maxP,value - minP);
    });
    return maxP;
};

169. 求众数

  • 给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
  • 你可以假设数组是非空的,并且给定的数组总是存在众数。

分析:将数组中出现的元素以及元素出现的次数 存进一个map里面 通过比较次数的大小 来找出对应的元素。代码如下:

var majorityElement = function(nums) {
    var map = new Map();
    nums.forEach(function (val,index,arr){
        if (map.has(val)) {
            var count = map.get(val);
            count++;
            map.set(val,count);
        } else {
            map.set(val,1);
        }
    });
    var el = 0, num = 0;
    for (let [key, value] of map) {
        if (num < value) {
            el = key;
            num = value;
        }
    }
    return el;
};

更好的实现:

var majorityElement = function (nums) {
    var count=0,
        num;
    nums.forEach(function (v) {
        if(count===0){
            num=v;
        }
        count+=(num===v)?1:-1;
    });

    return num;
};

217. 存在重复元素

  • 给定一个整数数组,判断是否存在重复元素。
  • 如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

分析:将数组进行排序后,判断数组的相邻两个元素之间是否相等,如果相等则返回true,将数组比较完之后都不存在相等的两元素则在最后返回false。代码如下:

var containsDuplicate = function(nums) {
    if (nums.length == 0 || nums == null) {
        return false;
    }
    nums.sort();
    for (var i = 1; i < nums.length; i++) {
        if (nums[i] == nums[i-1]) {
            return true;
        }
    }
    return false;
};

更好的实现:

var containsDuplicate = function(nums) {
  var arr = new Set(nums)
  return arr.size < nums.length
};

猜你喜欢

转载自blog.csdn.net/m0_37747665/article/details/81086063