leetcode1005

 1 func largestSumAfterKNegations(A []int, K int) int {
 2     sort.Ints(A)
 3     var negatives int
 4     var zeros int
 5     var positives int
 6     var negativeAry []int
 7     var positiveAry []int
 8     for n := range A {
 9         if A[n] < 0 {
10             negatives++
11             negativeAry = append(negativeAry, A[n])
12         } else if A[n] == 0 {
13             zeros++
14         } else {
15             positives++
16             positiveAry = append(positiveAry, A[n])
17         }
18     }
19     var sum int
20     if K <= negatives { //只需要把负数变正数,把最小的(绝对值大的)K个负数变正数
21         for i := 0; i < K; i++ {
22             sum += negativeAry[i] * -1
23         }
24         for i := K; i < negatives; i++ {
25             sum += negativeAry[i]
26         }
27         for i := 0; i < positives; i++ {
28             sum += positiveAry[i]
29         }
30     } else { //将全部的负数都变成正数,还不够
31         if zeros > 0 || (K-negatives)%2 == 0 {
32             //剩下的变化次数,全变0,或者反复的变偶数次同一个正数(也可以是一个已经变成正数的负数)
33             for i := 0; i < negatives; i++ {
34                 sum += negativeAry[i] * -1
35             }
36             for i := 0; i < positives; i++ {
37                 sum += positiveAry[i]
38             }
39         } else {
40             //先把负数的绝对值累加
41             for i := 0; i < negatives; i++ {
42                 sum += negativeAry[i] * -1
43             } //再把正数的绝对值累加
44             for i := 0; i < positives; i++ {
45                 sum += positiveAry[i]
46             } //判断全部已经都变成正数的数组中,绝对值最小的数字
47             //将绝对值最小的这个数字,减2次
48             if (negatives == 0 && positives > 0) || (positives > 0 && negatives > 0 && positiveAry[0] <= negativeAry[negatives-1]*-1) {
49                 sum += positiveAry[0] * -2
50                 return sum
51             }
52             if (positives == 0 && negatives > 0) || (positives > 0 && negatives > 0 && positiveAry[0] > negativeAry[negatives-1]*-1) {
53                 sum += negativeAry[negatives-1] * 2
54                 return sum
55             }
56         }
57 
58     }
59     return sum
60 }

上面这个一定觉得很啰嗦,那就来个简单的:

 1 func largestSumAfterKNegations(A []int, K int) int {
 2     sort.Ints(A)
 3     i := 0
 4     for i < len(A) && K > 0 && A[i] < 0 {
 5         A[i] = -A[i]
 6         i++
 7         K--
 8     }
 9     sum := 0
10     sort.Ints(A)
11     for j := range A {
12         sum += A[j]
13     }
14     if K > 0 && K%2 == 1 {
15         min := A[0]
16         sum -= min * 2
17     }
18     return sum
19 }

思想是一样的,但是简洁了很多。而且由于没有使用新数组保存正和负数,所以空间占用更小。

第一部分代码是思维的过程,第二部分代码是提炼之后的。leetcode上面的题目,大部分都可以用20,30行就搞定。如果代码特别长,那应该是没有抓住问题的本质,这样的代码思维可能把自己绕进去,别人看不懂,甚至自己也会看迷糊。

最后,go的效率的确是棒棒的:

转载于:https://www.cnblogs.com/asenyang/p/10506477.html

### LeetCode 哈希题目及解法 #### 1. 使用哈希表解决交集问题 对于两个数组 `nums1` 和 `nums2` 的交集问题,可以通过构建一个简单的哈希表来高效解决问题。具体实现如下: ```cpp class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> res; int hash[1005] = { 0 }; for (int i = 0; i < nums1.size(); i++) hash[nums1[i]]++; for (int i = 0; i < nums2.size(); i++) { if (hash[nums2[i]]) { res.push_back(nums2[i]); hash[nums2[i]]--; } } return res; } }; ``` 这种方法利用了一维数组作为哈希表记录第一个数组中各元素出现的次数,在遍历第二个数组时检查这些元素是否存在于哈希表中并相应减少计数值[^2]。 #### 2. 判断快乐数 快乐数是指不断替换该数为其各个位置上的数字的平方和最终能得到1的情况;否则进入循环无法得到1即不是快乐数。此过程可以用集合(Set)存储已经遇到过的中间结果以检测是否存在环形路径: ```javascript var isHappy = function(n) { let sums = new Set(); let sum = 0; let arr = String(n); while(true){ for(let i = 0;i<arr.length;i++){ sum += arr[i]*arr[i]; } if(sum===1)return true; if(sums.has(sum))return false; else{ sums.add(sum); arr = String(sum); sum = 0; } } }; ``` 这段代码展示了如何使用 JavaScript 中的 `Set` 数据结构来跟踪之前计算的结果从而避免陷入无限循环[^3]。 #### 3. 设计高效的哈希函数 当涉及到实际应用中的哈希算法设计时,有两个主要方面需要注意:一是将键转换成适合散列的数据形式,二是处理可能发生的冲突情况。通常情况下会对分桶数量取模(`%`)来进行映射,并采用诸如拉链法或开放地址法这样的策略应对潜在冲突[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值