zoukankan      html  css  js  c++  java
  • 二分搜索

    定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。
    public class Solution {
        public static int findPartMin(int[] data,int lo,int hi){
        	while(lo<=hi){
        		int mid = lo+(hi-lo)/2;
        		if(data[mid]<data[mid-1]&&data[mid]<data[mid+1])
        			return mid;
        		else if(data[mid]>data[mid-1])
        			hi = mid-1;
        		else if(data[mid]>data[mid+1])
        			lo = mid+1;
        	}
        	return -1;
        }
        public int getLessIndex(int[] arr) {
        	if(arr.length==1)
        		return 0;
        	else if(arr.length>1){
        		if(arr[0]<arr[1])
        			return 0;
        		else if(arr[arr.length-1]<arr[arr.length-2])
        			return arr.length-1;
        		else
        			return findPartMin(arr,1,arr.length-2);
        	}else
        		return -1;
        }
    }
    

      

    对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。

    给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。

    测试样例:
    [1,2,3,3,4],5,3
    返回:2
    import java.util.*;
    
    public class LeftMostAppearance {
        public int findPos(int[] arr, int n, int num) {
            // write code here
            int left = 0,right = n-1;
        	int pos = -1;
        	while(left<=right){
        		int mid = left+(right-left)/2;
        		if(arr[mid]>num)
        			right = mid-1;
        		else if(arr[mid]<num)
        			left = mid+1;
        		else{
        			pos = mid;
        			right = mid-1;
        		}
        	}
        	return pos;
        }
    }
    

    有一个有序数组arr,其中不含有重复元素,请找到满足arr[i]==i条件的最左的位置。如果所有位置上的数都不满足条件,返回-1。

    给定有序数组arr及它的大小n,请返回所求值。

    测试样例:
    [-1,0,2,3],4
    返回:2
    import java.util.*;
    
    public class Find {
        public int findPos(int[] arr, int n) {
            // write code here
            int left = 0,right = n-1;
        	while(left<=right){
        		int mid = left+(right-left)/2;
                if(arr[left]==left)
        			return left;
        		if(arr[mid]>mid)
        			right = mid-1;
        		else if(arr[mid]<mid)
        			left = mid+1;
        		else
        			return mid;
        	}
        	return -1;
        }
    }
    

      

    如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。

    给定kn,请返回k的n次方,为了防止溢出,请返回结果Mod 1000000007的值。

    测试样例:
    2,3
    返回:8
    import java.util.*;
    
    public class QuickPower {
        public int getPower(int k, int N) {
            // write code here
        	String bin = Integer.toBinaryString(N);
        	//System.out.println(bin+" "+bin.length());
        	long[] temp = new long[bin.length()];
        	temp[0] = k;
        	for(int i = 1;i < bin.length(); i++){
        		temp[i] = ((temp[i-1]*temp[i-1])%1000000007);
        		//System.out.println(temp[i]+" "+i);
        	}
        	long result = 1;
        	for(int i = bin.length()-1;i >= 0; i--)
        		if(bin.charAt(i)=='1'){
        			result = result*temp[bin.length()-1-i];
        			result = result%1000000007;
        		}
        	//System.out.println((int)result+" "+Integer.MAX_VALUE);
        	
        	return (int)result;
        }
    }
    

     更简洁的代码:

    import java.util.*;
     
    public class QuickPower {
        public int getPower(int k, int N) {
            // write code here
            if(k==0){
                return 0;
            }
            if(k==1){
                return 1;
            }
            if(N==0){
                return 1;
            }
            long modNum=1000000007;
            long res=1;
            long tmp=k;
             
            for(;N>0;N>>=1){
                if((N&1)!=0){
                    res*=tmp;
                }
                tmp=(tmp*tmp)%modNum;
                res=res%modNum;
                 
            }
          
            return (int)res;
        }
    }
    

      

    题目描述

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
    输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
    例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
    NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
    import java.util.ArrayList;
    public class Solution {
        public int minNumberInRotateArray(int [] array) {
            int left = 0,right = array.length-1;
            int mid = left;
            while(array[left]>=array[right]){
            	if(right-left==1){
            		mid = right;
            		break;
            	}
            	
            	mid = (left+right)/2;
            	
            	if(array[left]==array[right]&&array[mid]==array[left])
            		return search(array,left,right);
            	
            	if(array[mid]>=array[left])
            		left = mid;
            	else if(array[mid]<=array[right])
            		right = mid;
            }
            return array[mid];
        }
        
        int search(int[] array,int left,int right){
        	int result = array[left];
        	for(int i = left+1; i<=right; i++)
        		if(result>array[i])
        			result = array[i];
        	
        	return result;
        }
    }
    

      

  • 相关阅读:
    javascript 调试代码
    简洁的js拖拽代码
    搭个小窝
    FastDFS随笔
    JDK6和JDK7中String的substring()方法及其差异
    杂笔
    JVM内存随笔
    java中的final和volatile详解
    关于java的Synchronized,你可能需要知道这些(下)
    关于java的Synchronized,你可能需要知道这些(上)
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/5551202.html
Copyright © 2011-2022 走看看