1. 程式人生 > >js實現不同陣列m選n個數的組合演算法

js實現不同陣列m選n個數的組合演算法

原理比較簡單,m陣列中的每個數要麼出現,要麼不出現,只要滿足n個數出現就可以了

演算法步驟:

1、先生成一個和m陣列一樣長度的臨時陣列flagArr(陣列中除了0,就是1),flagArr中值為1的表示m該在位置的數字出現,0則表示不出現。初始化flagArr,前n位為1,其他全為0。

2、每次從左往右遍歷陣列flagArr,遇到第一個10,就將其變成01,再將變化位置左邊所有1移動到陣列的最左邊。輸出(儲存)當前陣列flagArr為結果。

3、繼續迴圈步驟2,一旦遇到flagArr為右邊n位全為1時,結束迴圈。

下邊是程式碼實現:

    function getFlagArrs () {
      let m = 5
      let n = 3
      if (!n || n < 1) {
        return []
      }

      let resultArrs = []
      let flagArr = []
      let isEnd = false
      let i, j, leftCnt

      for (i = 0; i < m; i++) {
        flagArr[i] = i < n ? 1 : 0
      }

      resultArrs.push(flagArr.concat())

      while (!isEnd) {
        leftCnt = 0
        for (i = 0; i < m - 1; i++) {
          if (flagArr[i] === 1 && flagArr[i + 1] === 0) {
            for (j = 0; j < i; j++) {
              flagArr[j] = j < leftCnt ? 1 : 0
            }
            flagArr[i] = 0
            flagArr[i + 1] = 1
            var aTmp = flagArr.concat()
            resultArrs.push(aTmp)
            if (aTmp.slice(-n).join('').indexOf('0') === -1) {
              isEnd = true
            }
            break
          }
          flagArr[i] === 1 && leftCnt++
        }
      }
      console.log(resultArrs)
      return resultArrs
    }
  }

相關推薦

js實現不同陣列mn個數組合演算法

原理比較簡單,m陣列中的每個數要麼出現,要麼不出現,只要滿足n個數出現就可以了 演算法步驟: 1、先生成一個和m陣列一樣長度的臨時陣列flagArr(陣列中除了0,就是1),flagArr中值為1的表示m該在位置的數字出現,0則表示不出現。初始化flagArr,前n位為1

js實現兩個單按鈕,不同的選項彈出顯示不同的下拉框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

mn組合的兩種演算法(C語言實現

原問題:  Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. 1. 遞迴演算法 即首先選擇n,然後遞迴地從剩下的1...n-1選擇k-1

JS實現文本全並復制

實現 comm () script ddr command val 全選 round 項目需要,自己用execCommand()方法寫了一個,目前在IE,chrome,fireFox 都正常運行; 話不多說,直接代碼: HTML部分 <input clas

js實現每次程序發送一個數據 ,多次發送不一樣,5秒後繼續執行多次程序,判斷如果五秒後發送過來的數據和上次不一樣,少的刪除多的增加

增加 開始 後繼 tin key cli 監控 沒有 sop /*存儲設備ID*/var IDSNew = new Array();//判斷是否已經啟用服務var isopen = true;//需要放到接收設備數據處IDSNew[client.deviceId]=new

使用vue.js實現checkbox的全和多個的刪除功能

ons eth table padding ted rip fun lpad let 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

利用js實現全、反、全不功能(check)

box tag 實現 所有 利用 .get 乒乓球 獲取 get <!DOCTYPE html><html><head><meta charset="utf-8"/><title></ti

js實現checkbox的全、反、全不

純js實現checkbox的全選、反選、分開:a. 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> &l

JS 實現表單 全和全不

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script> function checkAll(){

陣列中取n個數有多少種組合

private void mergeSort() { // int[] aa = {3, 5, 7, 9, 8, 4, 6, 1, 2}; // merge(aa, 0, aa.length-1); // for (int i=0;i<aa.

陣列中任意n個數的全排列(DFS)以及任意n個數組合

        今天做了poj1270這道題,採用了深度優先搜尋,確實啟發了我,無意中想了一個這麼一個問題:求陣列中任意n個數的全排列是不是也可以用深度優先去搜索(我理解這是一種深度搜索,不知道對不對)。 程式碼如下: #include<iostream> #i

java排列組合演算法MN

從M長度的容器中每次選取N個元素 舉例,從(a,b,c,d,e)中取兩個元素,則為(ab) (ac) (ad)(ae)(bc)(bd)(be)(cd)(ce)(de) import java.util.ArrayList; import java.uti

陣列中有n個數據,要將他們順序迴圈向後移k位,即前面的元素向後移k位

方法一:#include <stdio.h>#include <stdlib.h>int main(){int k,i,n,a[100]={0},b[100]={0};scanf("%d %d",&n,&k);for(i=0;i<

遞迴:從陣列中取n個數有多少種組合

還是在學習遞迴。 看別人的部落格自己學習了之後,來寫一下自己的理解吧。 首先這道題目是說,有一個數組,例如arr={1,2,3,4,5,6},給定一個n<=arr_len,例如給定4,問:從陣列中取4個數一共有多少種組合方式? 這個在數學上是排列組合

JS實現 LeetCode 陣列演算法(五)

628. 三個數的最大乘積 給定一個整型陣列,在陣列中找出由三個陣列成的最大乘積,並輸出這個乘積。 分析:因為有負數的出現 有兩種結果構成最大乘數,一是三個最大正數相乘,二是一個最大正數和兩個最小負數相乘。故將陣列排序後 將上述兩種情況都進行計算 比較兩者結果大小就可求

js實現 按鍵不可點和點狀態

//個人通訊錄搜尋按鈕     Person.changeSearchIcon = function(bool){         if(bool){             //可以點選搜尋             $('#btnSearch .txl-search').css({'background-p

不同的方法將n個數按輸入順序的逆序排列

用指標實現: void sort(int *p,int n) { int *p1,*p2,temp; for(int i=0;i<n/2;i++) { p1=p+i; p2=p+(n-1-i); temp=*p1; *p1=*p2; *p2=te

JS實現 LeetCode 陣列演算法(三)

268. 缺失數字 給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。 分析:將陣列進行升序排序,沒有缺失的陣列元素應該與其下標相等,故排序後遍歷陣列,將陣列下標與元素進行比較,若不相等,則陣列

js實現瀏覽器自動點

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"&

dedecms+js實現不同的欄目顯示不同的廣告位

網站多個欄目共用一個模板,想實現不同的欄目顯示不同的廣告位。解決方法: {dede:field name='typeid' runphp='yes'} if(@me=='1') { @me=""; } if(@me=='2') { @me=""; }