【算法】内存溢出问题

12 篇文章 0 订阅

之前很多次刷力扣题看题解,说有些解法会遇到内存溢出问题,不知道是幸运还是不幸,我从没遇见过,直到~~

力扣66题:加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:

输入:digits = [0]
输出:[1]

我的解法:

直接把[1,2,9]收集成129,再加一后130,再分割到数组里,很直观,复杂度也能接受。

   function plusOne($digits) {
        $count = count($digits);
        $nums = '';
        for($i=0;$i<$count;$i++){
            $nums .= $digits[$i];
        }
        $nums++;
        $digits = [];
        while($nums>=1){
        	$val = $nums%10;
        	array_unshift($digits,$val);
        	$nums = $nums/10;
        }
        return $digits;
    }

但是测试遇到[4,5,7,8,3,5,6,6,5,9,0,2,7,8,3,3,9,4,2,1,5,4,5,6,2,1,8,7,9,0,4,9,5,7,7,9,2,1,8,3,0]这么长的数组,我的int终于溢出了

目瞪口呆+恍然大悟之后,能想到的方法就是自己做进位了

function plusOne($digits) {
    $count = count($digits);

    $nums = '';
    $flag = 0;
    for($i=$count-1;$i>=0;$i--){
    	if($i == $count-1){
    		$digits[$i]++ ;
    	}
    	if($flag == 1){
    		$digits[$i]++;
    	}
    	if($digits[$i] == 10){
    		$flag = 1;
    		$digits[$i] = 0;
    	}else{
    		$flag = 0;
    		
    	}
    }
    if($flag == 1){
    	array_unshift($digits,1);
    }
    return $digits;
}

之前有二进制求和我也是用的自己写进位

67二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"
示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

    function addBinary($a, $b) {
    	if($a == 0 && $b == 0){
    		return '0';
    	}
    	$i= $j = 1;
    	$flag = 0;
    	$nums = '';
    	while($i<=strlen($a) || $j<=strlen($b)){
    		$sub = 0;
    		if($i<=strlen($a)){
    			$sub += substr($a,-$i,1);
    		}
    		if($j<=strlen($b)){
    			$sub += substr($b,-$j,1);
    		}
    		$adds = $sub + $flag;
    		
    		if($adds>=2){
    			$flag = 1;
    			$adds = $adds-2;
    		}else{
    			$flag = 0;
    		}
    		$nums = $adds.$nums;
    		$i++;
    		$j++;
    	}
    	if($flag == 1){
    		$nums = '1'.$nums;
    	}
    	
    	return $nums;
    }

ps:

官方运行时间、内存占用情况很多时候和运行时选取的这批测试用例关系很大,千万不要以为自己写的例子打败了百分之几十几十就真的很厉害(不信多提交几次,结果通常是有差异的),一定要规规矩矩算时间空间复杂度,综合分析算法的优劣。

当然像我这样的菜鸡,逼急了暴力破解也是解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值