leetcode 1005 python brute force法与妙法

这篇博客讨论了一种处理数组中负数、0和正数的转换策略,按照优先级进行操作。作者首先提出了暴力解决方法,通过排序和循环来变换数组元素,然后详细分析了可能出现的问题并提出解决方案。接着,作者介绍了YouTube上的一种更简洁的解法,即在k次循环内找到最小值并取反,这种方法涵盖了所有情况。博客重点在于算法的实现和优化。
摘要由CSDN通过智能技术生成

开始思路----
(1)负数优先级最高,从小往大变
(2)0优先级第2,负数全变完变0
(3)正数优先级最低,最后变正数,从小往大变

#法一,暴力法,纯暴力,写了一上午我他喵,一开始想法就大概是上面的,

一,先排序从小到大,循环k次,(1)if 遇到负数取相反数,(3)elif 遇到0,直接break弹出(因为可以重复取0)(3)else 遇到正数,此时nums全为正数,判断剩余还可以转换"变身"次数,如果为奇数则sorted把第一个(最小)取负数return sum;如果为偶数,直接return sum

二,想法很好但是会出现这种情况[1,2,-3] k=5, k会超出len(nums) 就会index out of range, 所以我的对策再分两大种情况,len(nums)<k.和len(nums)>k,但是!!!他喵第一种情况我直接复制后一种代码,在全为正时又不行 。[1,2,3] k=5,里面再分,第一种情况下全为正,不全为正怎么办。

    nums=sorted(nums)
    count=0      
    if len(nums)<k:  #这种情况就是跑完了len(nums),全变为正数了,但是还有变身的次数
        for h in nums: #排除一个特例[1,2,3] 5 全为正len(nums)<k
            if min(nums)>=0:
                if k%2==0:
                    return sum(nums)
                else:
                    return sum(nums)-2*min(nums)
            else:
                for i in range(len(nums)): #问题,非要两个for loop,不是所有的都变是当前最小的才变
                    if nums[i]<0:
                        nums[i]=-nums[i]
                        count=count+1
                    elif nums[i]==0:
                        break
                    else:                #第一次的漏洞,全为正数时可以一直变一个,分奇偶两种情况就行
                        if (k-count)%2==0:
                            break
                        else:
                            nums=sorted(nums) #这边已经全是正数了把正数里面最小的一个给变了就OK
                            nums[0]=-nums[0]
                nums=sorted(nums)                                  
                if (k-len(nums))%2==0:              
                    return sum(nums)
                else:
                    return sum(nums)-2*min(nums)

    if len(nums)>=k: #可能会出现 [-4,-2,-3], 4, 此时i为0,1,2,3 index out of range
        for i in range(k): #自己做时的问题,非要两个for loop,不是所有的都变,是当前最小的才变
            if nums[i]<0:
                nums[i]=-nums[i]
                count=count+1
            elif nums[i]==0:
                break
            else:                    #第一次的漏洞,全为正数时可以一直变一个,分奇偶两种情况就行
                if (k-count)%2==0:
                    break
                else:
                    nums=sorted(nums) #这边已经全是正数了把正数里面最小的一个给变了就OK
                    nums[0]=-nums[0]                                  
        return sum(nums)
    
    
    #法2 youtube上的解法  一共循环k次,每次找到当前最小的,然后取相反数,太妙了,所有情况都含在里面了   
    for i in range(k):
       a=nums.index(min(nums))
       nums[a]=-nums[a]
    return sum(nums)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值