算法加油包之常考算法

168 阅读1分钟

0. 算法的简单了解

0.1 思路:会用到递归、循环,和数组结构的思想
  • 递归可以用代入法或调用栈快速理解;
  • 所有的递归都可以改写成循环;
  • 空间复杂度和时间复杂度:zhuanlan.zhihu.com/p/50479555
0.2 数据结构包括数组和hash
  • 数组分为队列和栈;队列是先进先出,数组是后进先出;
  • hash用来存储 key-value 键值对

1. 快速排序

阮一峰的快速排序:www.ruanyifeng.com/blog/2011/0…

var quickSort = function(arr) {
  if (arr.length <= 1) { return arr; }  // 检查元素个数,小于等于1直接返回
  var pivotIndex = Math.floor(arr.length / 2);  // Math.floor()可以理解为向下取整
  var pivot = arr.splice(pivotIndex, 1)[0];  // 选择基准pivot,将其与原数组分离
  var left = [];  // 再定义一左一右两个孔数组
  var right = [];
  for (var i = 0; i < arr.length; i++){  // 遍历数组,小于pivot的放左边,大于放右边
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));  //递归重复过程后排序
};

2. 计数排序

杜小白的计数排序(有优化空间):blog.csdn.net/DFF1993/art…

function countingSort(arr, maxValue) {
    var bucket = new Array(maxValue+1),
        sortedIndex = 0;
        arrLen = arr.length,
        bucketLen = maxValue + 1;
    for (var i = 0; i < arrLen; i++) {
        if (!bucket[arr[i]]) {
            bucket[arr[i]] = 0;
        }
        bucket[arr[i]]++;
    }
    for (var j = 0; j < bucketLen; j++) {
        while(bucket[j] > 0) {
            arr[sortedIndex++] = j;
            bucket[j]--;
        }
    }
    return arr;
}
var arr = [2, 3, 8, 7, 1, 2, 7, 3];
console.log(coutingSort(arr,8))

3. 大数相加

参考了leetcode上的答案

var maxSubArray = function(nums){
  let sum = 0
  let Max = nums[0]
  for(let i = 0; i<nums.length; i++){
    sum += nums[i]  // x+=y 等同于 x=x+y
    Max = Math.max(Max,sum) // Math.max()返回一组数中的最大值
    if(sum<0){
      sum=0
    }
  }
  return Max
}

4. 两数之和

参考了leetcode上的答案

var twoSum = function (nums, target){
  for(let i = 0; i< nums.length; i++){
    for(let j = i+1; j<nums.length; j++){
      if(target - nums[i] === nums[j]){
        return [i,j]
      }
    }
  }
  console.log('No solution')
}