LeetCode刷题笔记_03


二分法查找

# 参考java.util.Arrays中的方法binarySearch(int[] a,int value)
public class BinarySearch{
    public static int binarySearch(int[] nums,int target){
        return binarySearch0(nums,0,nums.length,target);
    }
    public static int binarySearch0(int[] a,int fromIndex,int toIndex,int key){
        int low = fromIndex;
        int high = toIndex - 1;
        while(low <= high){
	    int mid = (low + high) >>> 1;
	    int midVal = a[mid];	
	    if (key < midVal)
	        high = mid - 1;
	    else if (key > midVal)
		low = mid + 1;
	    else 
		return mid;			
	}
	return -(low)+1;
    }
    public static void main(String[] args){
	//分别获取参数列表
	String[] arguments = args[0].split(",");
	int target = Integer.parseInt(args[1]);
	int[] nums = new int[arguments.length];
	//将String数组转换成整型数组
	for(int i = 0;i < arguments.length;i++){
	     nums[i] = Integer.parseInt(arguments[i]);
	}
	//调用方法binarySearch
	int index = binarySearch(nums,target);
	//输出方法返回的结果
	if (index > 0 )
  	    System.out.println("该值的位置: " + index );
    else
  	    System.out.println("找不到该值");
    }
}

两数之和

/**
 * 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
 *
 * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
 *
 * 你可以按任意顺序返回答案。
 *输入:nums = [2,7,11,15], target = 9
 * 输出:[0,1]
 * 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
 * 
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/two-sum
 *著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
import java.util.*;
public class TwoSum{
    public static  int[] twoSum(int[] nums, int target) {
        int[]  array = new int[2];
        for(int i = 0;i < nums.length - 1;i++){
        int key =  target - nums[i];
        for (int j = i+1;j< nums.length - 1;j++){
	       if(key == nums[j]){
	           array[0] = i;		
	           array[1] = j;		
		   return array;	
       	       }	
	   }
	}
	return null;	
     
    }
    public static void main(String[] args){
        String[] strr = args[0].split(",");
        List<String> list = new ArrayList<>();
	for(int i = 0;i < strr.length;i++){
	    list.add(strr[i]);
	}
	int[] nums = new int[list.size()];
	for(int i = 0; i < list.size();i++){
            nums[i] = Integer.parseInt(list.get(i));
	}
	for(int i = 0; i < nums.length;i++){
	   if(i == (nums.length - 1)){
	       System.out.print(nums[i]+" ");
	       break;			
	   } 
	   System.out.print(nums[i] +", ");	
	}	
	int target = Integer.parseInt(args[1]);
  	int[] arr = twoSum(nums,target);
        if(arr != null && arr.length != 0){
            System.out.println("数组的下标为: [ "+ arr[0]+", " + arr[1]+ " ]");
        }else{

            System.out.println("没有找到合适的两个数字");
        }
    }	
}

两数之和 解法:巧用循环

import java.util.*;
public class TwoSum{
    public static  int[] twoSum(int[] nums, int target) {
	int[]  array = new int[2];
    	for(int i = 0;i < nums.length - 1;i++){
	   int key =  target - nums[i];
	   for (int j = i+1;j< nums.length - 1;j++){
	       if(key == nums[j]){
	           array[0] = i;		
	           array[1] = j;		
		   return array;	
       	       }	
	   }
	}
	return null;	
     
    }
    public static void main(String[] args){
	String[] strr = args[0].split(",");
	List<String> list = new ArrayList<>();
	for(int i = 0;i < strr.length;i++){
	    list.add(strr[i]);
	}
	int[] nums = new int[list.size()];
	for(int i = 0; i < list.size();i++){
            nums[i] = Integer.parseInt(list.get(i));
	}
	for(int i = 0; i < nums.length;i++){
	   if(i == (nums.length - 1)){
	       System.out.print(nums[i]+" ");
	       break;			
	   } 
	   System.out.print(nums[i] +", ");	
	}	
	int target = Integer.parseInt(args[1]);
  	int[] arr = twoSum(nums,target);
	if(arr != null && arr.length != 0){
	    System.out.println("数组的下标为: [ "+ arr[0]+", " + arr[1]+ " ]");
	}else{

	    System.out.println("没有找到合适的两个数字");
	}
    }	
}

两数之和 解法:使用HashMap

import java.util.*;
/**
 * 两数之和解法之 HashMap
 * 
 *
 */
public class TwoSumWay2{

    public static  int[] twoSum(int[] nums, int target) {
        int[] indexs = new int[2];
        
        // 建立k-v ,一一对应的哈希表
        HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
        for(int i = 0; i < nums.length; i++){
            if(hash.containsKey(nums[i])){
                indexs[0] = i;
                indexs[1] = hash.get(nums[i]);
                return indexs;
            }
            // 将数据存入 key为补数 ,value为下标
            hash.put(target-nums[i],i);
        }
        return indexs;
    }
    public static void main(String[] args){
	//获取参数
	String[] arguments = args[0].split(",");
	int target = Integer.parseInt(args[1]);
	int[] nums = new int[arguments.length];
	//将String数组转换成整型数组
	for(int i = 0;i < arguments.length;i++){
	    nums[i] = Integer.parseInt(arguments[i]);
	}
	//调用twoSum方法
	int[] indexs = twoSum(nums,target);
	//获取返回值并输出
	System.out.println("[ " + indexs[0] + ", " + indexs[1] + " ]");
    }    
}

文章作者: rudy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 rudy !
  目录