【7.8】算法复习二 二分

7.7

  • 17 最基本二分查找
function search( nums ,  target ) {
    // write code here
    let left = 0,right = nums.length -1
    while(left <= right){
        let mid = Math.floor((left+right)/2)
        let num = nums[mid]
        if(target == num){
            return mid
        }else if(num > target){
            right = mid - 1
        }else{
            left = mid + 1
        }
    }
    return -1
}
  • 18 二维递增数组查找(行列均递增)
function Find(target, array)
{
    // write code here
    let n = array[0].length
    for(let i=0;i<array.length;i++){
        let temp = array[i]
        for(let j=0;j<n;j++){
            if(temp[j] == target){
                return true
            }else if(temp[j]>target){
                if(j == 0){
                    return false
                }else{
                    n=j
                }
            }
        }
    }
}
  • 19 寻找数组峰值
function findPeakElement( nums ) {
    // write code here
    let left = 0,right = nums.length-1
    while(left<right){
        let mid = Math.floor((left+right)/2)
        if(nums[mid] < nums[mid+1]){
            left = mid+1
        }else{
            right = mid
        }
    }
    return right
}
  • 20 数组中的逆序对【好难 继续写归并】
function InversePairs(data)
{
    // write code here
    let count = 0
    mergesort(data)
    function mergesort(arr){
        if(arr.length < 2) return arr
        let mid = Math.floor(arr.length/2)
        let left = arr.slice(0,mid)
        let right = arr.slice(mid)
        function mergetwo(left,right){
            let result = []
            while(left.length && right.length){
                if(left[0]>right[0]){
                    count = count + left.length
                }
                result.push(left[0]<=right[0]?left.shift():right.shift())
            }
            return result.concat(left,right)
        }
        return mergetwo(mergesort(left),mergesort(right))
    }
    return count % 1000000007
}
  • 21 旋转数组的最小数字(非递减数组旋转 比如[3,4,5,2,2])
function minNumberInRotateArray(rotateArray)
{
    // write code here
    let arr = rotateArray
    if(arr.length < 2) return arr
    if(arr.length == 2) return Math.min(arr[0],arr[1])
    let mid = Math.floor(arr.length/2)
    let midvalue = arr[mid]
    let left = arr.slice(0,mid+1)
    let right = arr.slice(mid+1)
    let leftmost = arr[0],rightmost = arr[arr.length - 1]
    if (leftmost>midvalue) return minNumberInRotateArray(left)
    else if (midvalue>rightmost) return minNumberInRotateArray(right)
    else return Math.min(minNumberInRotateArray(left),minNumberInRotateArray(right))
}
  • 22 比较版本号 (比如1.0.2 > 1.0.1)
function compare( version1 ,  version2 ) {
    // write code here
    let arr1 = version1.split('.')
    let arr2 = version2.split('.')
    let i = 0
    while(i<arr1.length || i<arr2.length){
        let x=0,y=0
        if(i<arr1.length) x=parseInt(arr1[i])
        if(i<arr2.length) y=parseInt(arr2[i])
        if(x>y) return 1
        if(x<y) return -1
        i++
    }
    return 0
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值