学习算法第一天

作者: 顽皮的雪狐七七 | 来源:发表于2019-07-08 20:11 被阅读4次

预热——桶排序起始

昨天半夜的一道题。

一个长度为N的数组,每个元素为0~9的数字,将其从大到小进行排序。

桶排序1.png

思路:
设定一个长度为10的数组,下标分别是0~9,遍历长度为N的数组,将其对应的下标元素+1,在输出的时候,从下标为9的开始遍历输出即可。

function Find(array){
  var box = new Array(10).fill(0);
  var arrayBox = [];
  array.forEach(function(value,index){
    box[value]++;
  })
  for(let j = box.length-1 ; j >= 0 ; j--){
    for(let i = 0 ; i < box[j] ; i++){
      arrayBox.push(j);
    }
  }
  return arrayBox;
}

第一道题

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

第一思路

解析

外层函数循环,第一个参数进行判断,如果第一个参数都大于目标数,那么不需要进行遍历,直接输出false,

如果小于目标数,对内层函数进行every循环,如果数字小于目标数,继续进行循环,

如果没有,判断是否相等,如果相等输出true,并结束循环,

如果大于就退出本次内层循环。

function Find(target, array)
{
    var have = false;
    array.forEach(function(value,index){
        //如果第一个数大于目标数,就返回false
        if(have == true || value[0] > target){
            return false;
        //第一个数不大于目标数,进入第二层循环
        } else {
            //如果里面的数小于目标数,就循环,如果大于目标数,就退出循环,如果等于也退出循环
            value.every(function(v,i){
                if(v < target){
                    return true;
                }else{
                    if(v == target){
                        have = true;
                    }
                    return false;
                }
            })
        }
    })
    return have;
}

估计复杂度

空间复杂度是1,时间复杂度是M×N

第二思路

解析

将二维数组弄成棋盘,外层为排,内层为列。

棋盘.png

可以看出来,左上角是最小数,右下角是最大数,那么我们从右上角进行,如果目标数比右上角的数大,那么向下走,如果比右上角的数小,就往左走。最坏的结果,是走到左下角。

  1. 首先注意判断边界:
  2. 跳出循环的条件:
    2.1 首先到达左下角就说明,没有这个变量,需要跳出。
    2.2 在循环中找到这个变量相等的情况,需要跳出。
function Find(target, array)
{
  //确定右上角起点坐标array[i][j] = array[0][array[0].length -1]
    //横排变量
    var i = 0;
    //竖排变量
    var j = array[0].length -1;
    //循环进行判断
    while(true){
        //判断边界,如果超出了左下角就退出循环并且返回false
        if(i >= array.length || j < 0){
            return false
        }
        //如果没有超出边界,就判断是否相等,如果相等直接跳出循环并且返回true
        if(target == array[i][j]){
            return true
        }
        //如果没有达到跳出循环条件,那么判断是该往下走还是往左走
        if(target > array[i][j]){
            i++;
        }else{
            j--;
        }
    }
}

评估复杂度

空间复杂度是O1,时间复杂度是M+N

相关文章

  • StanFord 机器学习公开课笔记(4):生成学习算法

    本讲视频及讲义链接 生成学习算法 生成学习算法和判别学习算法的区别 判别学习算法(Discriminative) ...

  • 机器学习(1)——几个基本要素

    学习算法 什么是学习算法,学习当然不是一个动词,学习算法最简单的理解便是能够从数据中学习的算法,学习的解释根据 M...

  • 学习算法第一天

    预热——桶排序起始 昨天半夜的一道题。 一个长度为N的数组,每个元素为0~9的数字,将其从大到小进行排序。 思路:...

  • 谁能看懂这个

    机器学习算法盘点:人工神经网络、深度学习 机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法...

  • Adaboost算法

    AdaBoost是典型的Boosting算法。Boosting提升算法,是将“弱学习算法“提升为“强学习算法”的过...

  • 机器学习4:局部加权回归

    参数学习算法,非参数学习算法 参数学习算法,用固定的明确的参数进行数据的拟合。比如线性回归。非参数学习算法,使用的...

  • 人工智能学习

    人工智能算法可以分为机器学习算法(Machine Learning)和深度学习算法(Deep Learning) ...

  • 机器学习算法分类大全

    机器学习算法可以分为监督学习算法、无监督学习算法和半监督学习算法,下面以思维导图的形式总结了一下常见的监督学习和无...

  • 《机器学习(周志华)》学习笔记(三)

    Q:机器学习中最简单的学习算法是什么? A:最简单的机器学习算法莫过于线性回归算法了。线性回归算法的基本形式如下:...

  • OpenCV算法学习笔记之边缘检测(一)

    此系列的其他文章:OpenCV算法学习笔记之初识OpenCVOpenCV算法学习笔记之几何变换OpenCV算法学习...

网友评论

    本文标题:学习算法第一天

    本文链接:https://www.haomeiwen.com/subject/uskahctx.html