js貪心算法


 

 

 

 

 

 

 

 

export default (prices)=>{
  //用來保存利潤
  let count=0
  for(let i=0,len=prices.length;i<len;i++){
     for(let j=i;j<len-1;j++){
       if(prices[j+1]>prices[j]){
         count+=prices[j+1]-prices[j]
         i=j
       }else{
         i=j
         break
       }
     }
  }
  return count
}

  

 

 

export default(intput)=>{
  //表示自己的錢箱(用於存儲零錢)
  let hand=[]
  //判斷是否有顧客還在
  while(Input.length){
    //取出當前排在最前面顧客的錢
    let money=inpuy.shift()
    if(money===5){
      hand.push(money)
    }else{
      //零錢降序排列
      hand.sort((a,b)=>b-a)
      let change=money-5
      for(let i=0,len=hand.length;i<len;i++){
        if(hand[i]<=change){
          change-=hand[i]
          hand.splice(i,1)
          //刪除了元素數組的長度發生了變化,要維持剛才的i不變
          i--
        }
        if(change===0){
          break
        }
      }
      //沒有足夠的零錢
      if(change!==0) return false
      else hand.push(money)  //顧客錢存起來
    }
  }
  return true
}

  動態規划:

export default(arr,m,n)=>{
  let dp=(m,n)=>{
    //,=2,n=2
    if(m===2&&n===2){
       return(arr[1][1]===1||arr[1][0]+arr[0][1]===2)?0:(arr[1][0]===1||arr[0][1]===1)?1:2
    }else if(m<2||n<2){
      if(m<2){
        //單行有1就返回0,沒有1返回0
       return arr[m-1].includes(1)?0:1
      }else{
        //單列中不能有障礙物(1) 有返回0 沒有返回1
        for(let i=0;i<m;i++){
          if(arr[i][0]===1){
            return 0
          }
        }
        return 1
      }
    }
    else{
      return dp(m-1,n)+dp(m,n-1)
    }
  }
  return dp(m,n)
}

  查找兩地最短距離

export default(src,dst,k)=>{
    //對n個城市m個航班做飛行說明
    let fights=[
         [0,1,100],
         [1,2,100],
         [0,2,500]
    ]
    let cheap=(src,dst,k)=>{
        let prev=fights.filter(item=>item[1]===dst)
        let min=Math.min.apply(null,prev.map(item=>{
            //從dst往前找,找到了起始城市
            if(item[0]===src&&k>-1){
                return item[2]
            }else if(k===0&&item[0]!==src){
                return Number.MAX_SAFE_INTEGER
            }else{
                return item[2]+cheap(src,item[0],k-1)
            }
        }))
        return min
    }
    return cheap(src,dst,k)||-1
}

  數組的優缺點:

 

 

 

 

 

 

 

 優先隊列:

 

 

 

 

 

 

 

前綴樹:

 

 

棧封裝:

function Stack(){
    //棧中的屬性
   this.items=[]
   //棧的相關操作 1.將元素添加棧  2.從棧中取出元素 3.查看一下棧頂元素  4.判斷棧是否為空  5.獲取棧中元素的個數 6.toString方法
   Stack.prototype.push=function(element){
       this.items.push(element)
   }
   Stack.prototype.pop=function(){
       return this.items.pop()
   }
   Stack.prototype.peek=function(){
	   return this.items[this.items.length-1]
   }
   Stack.prototype.isEmpty=function(){
       return this.items.length===0
   }
   Stack.prototype.size=function(){
       return this.items.length
   }
   Stack.prototype.toString=function(){
       var resultString=''
       for(var i=0;i<this.items.length;i++){
        resultString+=this.items[i]+' '
       }
       return resultString
   }
}

  

//函數:十進制轉二進制
function dec2bin(decNumber){
     //1.定義一個棧對象
     var stack=new Stack()

	 //2.循環操作
	 while(decNumber>0){
		 //2.1獲取余數,並放入到棧中
		 stack.push(decNumber % 2)

		 //2.獲取整除后的結果,作為下一次運算的數字
		 decNumber=Math.floor(decNumber/2)
	 }
	 //3.從棧中取出0和1
	 var binaryString=''
	 while(!stack.isEmpty()){
		binaryString+=stack.pop()
	 }
	 return binaryString
}

  封裝隊列

//分裝隊列類
function Queue(){
	//1.屬性
     this.items=[]
	//2.方法  1.將元素添加到隊列中 2.從隊列中刪除前端元素  3.查看前端的元素  4.查看隊列是否為空  5.查看隊列中元素的個數  6.toString()方法
    Queue.prototype.enqueue=function(element){
		 this.items.push(element)
	}

	Queue.prototype.dequeue=function(){
	   return this.items.shift()
	}

	Queue.prototype.front=function(){
		return this.items[0]
	}

	Queue.prototype.isEmpty=function(){
		return this.items.length===0
	}

	Queue.prototype.size=function(){
		return this.items.length
	}

	Queue.prototype.toString=function(){
		var resultString=''
		for(var i=0;i<this.items.length;i++){
			resultString+=this.items[i]+''
		}
		return resultString
	}
}

  丟手帕:

function passGame(nameList,num){
        var queue=new Queue()
        for(var i=0;i<nameList.length;i++){
            queue.enqueue(nameList[i])
        }

        while(queue.size()>1){
            for(var i=0;i<num-1;i++){
               queue.enqueue(queue.dequeue())
            }

            queue.dequeue()
        }
        alert(queue.size())
        var endName=queue.front()
        alert('最后剩下的人'+endName)
        return nameList.indexOf(endName)
        
    }
    names=['Lily','Lucy','Tom','Lilei','Why']
    alert(passGame(names,3))

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM