學習算法第一天

預熱

昨天半夜的一道題。數組

一個長度爲N的數組,每一個元素爲0~9的數字,將其從大到小進行排序。函數

思路: 設定一個長度爲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;
}
複製代碼

第一道題

在一個二維數組中(每一個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。ui

第一思路

解析

外層函數循環,第一個參數進行判斷,若是第一個參數都大於目標數,那麼不須要進行遍歷,直接輸出false,
若是小於目標數,對內層函數進行every循環,若是數字小於目標數,繼續進行循環,
若是沒有,判斷是否相等,若是相等輸出true,並結束循環,
若是大於就退出本次內層循環。spa

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×N3d

第二思路

解析

將二維數組弄成棋盤,外層爲排,內層爲列。
code

能夠看出來,左上角是最小數,右下角是最大數,那麼咱們從右上角進行,若是目標數比右上角的數大,那麼向下走,若是比右上角的數小,就往左走。最壞的結果,是走到左下角。

  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+Ncdn

相關文章
相關標籤/搜索