zoukankan      html  css  js  c++  java
  • 【leetcode】-两数之和

    给定一个整数数列,找出其中和为特定值的那两个数。

    你可以假设每个输入都只会有一种答案,同样的元素不能被重用。

    给定 nums = [2, 7, 11, 15], target = 9
    
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]
    

      

    //两层循环,当前元素和当前元素的下一个元素相加并比较
    //暴力解法  时间复杂度: O(N^2)
    
    function twoSum($arr,$target){
    	for($i=0;$i<count($arr);$i++){
    		for($j=$i+1;$j<count($arr)-$i;$j++){
    			if($arr[$i]+$arr[$j]==$target){
    					return [$i,$j];
    			}
    		}
    	}
    
    }
    

      

    思路二:
    数组必须有序
    维护两个指针,一个指向数组头,一个指向数组尾
    两个指针指向的值相加sum
    if sum>target 则尾指针往前移动
    is sum<target 则头指针后移
    
    function twoSum($arr,$target){
    	$i = 0;
    	$j = count($arr)-1;
    	while ($i<count($arr) && $j>=0) {
    		# code...
    		if($arr[$i] + $arr[$j]== $target){
    			return [$i,$j];
    		}elseif($arr[$i] + $arr[$j] > $target){
    			$j--;
    		}else{
    			$i++;
    		}
    
    	}
    }
    

      思路三:

    用target和数组中每个元素相减的值存在一个新数组中,循环遍历$arr看是否有相减后的值存在临时数组中,如存在就返回存在值的键和当前减去值的键

    $arr = [2, 7, 11, 15, 18, 31]; $target = 33; $ret = $bu_arr = []; foreach ($arr as $k=>$v){ if(in_array($v, $bu_arr) && array_search($v, $bu_arr)!=$k){ $ret[] = array_search($v, $bu_arr); $ret[] = $k; } $bu_arr[] = $target - $v; } print_R($ret);

      

  • 相关阅读:
    POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题
    POJ2226 Muddy Fields 二分匹配 最小顶点覆盖 好题
    POJ 2195 Going Home 最小费用流 裸题
    POJ 3368 Frequent values RMQ 训练指南 好题
    POJ 3187 杨辉三角+枚举排列 好题
    POJ 2393 贪心 简单题
    系统监控
    系统的初始化和服务
    vi与vim
    正文处理命令及tar命令
  • 原文地址:https://www.cnblogs.com/oceanL/p/8796089.html
Copyright © 2011-2022 走看看