[路飞]_算法学习

前言

这周加班有点狠,早上10点半到公司晚上回到家11点精力几乎奔溃,刷完一题算法,在洗漱一下已经1点左右。自己的进度还是比较慢的,各方都在争夺自己的利益,产品为了产品更好,持续改动小需求, 后端人员为了自己能快速完成任务,数据几乎很少处理,接口的什么规范没有落地就是鬼扯,一会给我说get put post delete, 一会又给我搞个formdata 不经想到之前一家创业型公司技术团队一共7个人给我说我们要测试驱动开发玩的tdd开发模式,我看看了代码,这种代码和我在百度上复制的有啥区别,问我为啥出bug 我哪里知道,代码都是百度上复制的。今年是第四个年头眼看还有一个月就进入第五个年头,却还在这种团队呆着,着实感觉自己有些差劲。一边说这高大上的理念,一边又不实实在在的践行落地,这种画饼的伎俩真是low。在一些先进的东西面前我觉得还是要去适应的,vscode 之前 我们习惯于sublime,webstrom, vscode 出来之后呢大多数人开始习惯使用vscode,听说最近idea 的Fleet未来也要出生。希望自己能很好的适应新出现的规则和变化。昨天加班回来后倒头就睡,今天快一点爬起来洗漱完,推开窗发现楼下的这个颜色挺好看。

WechatIMG12.jpeg

二分查找返回目标元素下标

描述: 给定一个数组,输入一个目标数,返回这个数的下标没有找到这个目标值返回-1;

解题思路:

    1. 将数组对半分开 获取中间分界点
    1. 用目标值比对中间分界点
    1. 如果相等返回分界点的下标值。如果发现分界点小于目标值,那么说明目标值很可能在大于分界点的那部分值中,如果发现分办点小于目标值,那么说明目标值很可能在小于分界点的那部分。
    1. 如果出现不相等的情况,进下步动态缩小查找范围。
    1. 重复1-4步。

44.jpg

33.jpg

22.jpg

解:

findTarget(arr, target) {
    let min = 0;
    let max = arr.length - 1;
    
    while(min <= max) {
       // 动态获取分界点
        let mind = (Math.floor((max - min) / 2)) + min;
        
        if (arr[mind] == target) {
            return mind;
        }
        if (arr[mind] < target) {
           min = mind + 1;
        }
        
        if (arr[mind] > target) {
           max = mind - 1;
        }
        
    }
    
    
    return -1;
}

复制代码

二路归并排序

描述: 数据排序已经很长常见了,给定一个乱序的数组,返回从小到到的排序后返回

解题思路:

    1. 把这一堆数据按组划分 分到最小一个组块为一个单元停上划分
    1. 所有数据划分完成停止划分
    1. 划分到最小单元后 开始两两有序的开始合并

3.jpg

5.jpg

7.jpg

9.jpg

2.jpg

3.jpg 8.jpg

2.jpg

解:

   halfSort(arr) {
      // 最小单元了开始返回
      if (arr.length <2) {
          return 
      }
      
      let mind = Math.floor(arr.length / 2);
      
      let left = arr.slice(0, mind);
      
      let right = arr.slice(mind, arr.length);
      
      // 左右合并
      return merge(halfSort(left), halfSort(right));
  }
  
  merge(left, right) {
      let arr = [];
      while(left.length && right.length) {
          // 比较划分后每个块的第一个元素
          if (left[0] < right[0]) {
              arr.push(left.shift());
          } else {
              arr.push(right.shift());
          }
      }
      
      //left和right长度不一样时,直接连接剩下的长的部分(上次比划后的有序数据)
      return arr.concat(left, right);
  }
复制代码

两数之和

描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

解题思路:

    1. 先为当前的数据建立一个索引的map 对象
    1. 然后遍历目标元素在生成的map对象中查找,如果生成map对象中找到了当前值返回当前的map对象值的索引。

解:

 twoSun(nums, target) {
    let map = new Map();
    // 根据当前数组建立map索引
    for (let i = 0; i < nums.length; i++) {
       map.set(nums[i], i);
    }
    for (let j = 0; j < nums.length; j++) {
       let tmp = target - nums[j];
       if(map.has(tmp) && map.get(tmp) != j){
          return [j, map.get(tmp)]
       }
    }
}
复制代码

两数平方和

描述: 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。

解题思路

  1. 得到平方根确定为最大值,在设置一个最小值。
  2. 根据平方根根公式计算出当前范围内的两个数的值 开始循环,如果计算出的值和这个数相等返回 true 如果小于这个数,动态调整两个变量的大小

解:

 sqanSun(number) {
    let min = 0 ; 
    // 得到平方根
    let max = parseInt(Math.sqrt(number));
    while(min <= max) {
        //平方公式
        let current = min * min + max * max ;
        if(current == number) {
            return true
        } 

        if(current < number) {
            min++;
        }

        if(current > number) {
            max--;
        }
    }

    return false;
}
复制代码

猜你喜欢

转载自juejin.im/post/7040758315231477767