更多算法实现见: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 的数组,找到其中的众数。众数是指在数组中出现次数大于
⌊ 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
};