Leetcode1005

分情况进行讨论:
cnt是负数个数
1. k<=cnt
按照负数大小依次取反
2.k>cnt
存在0值或剩余取反数为偶数
不存在0值,剩余取反数为奇数: 将绝对值最小的一个取反
匿名表达式 重写Comparetor
new PriorityQueue<>((a,b)->{nums[a]-nums[b]});
E poll():从队首删除并返回一个元素
E peek():返回队首的元素(但是不删除)
代码如下
public int largestSumAfterKNegations(int[] nums, int k) { boolean zero=false; Integer index=0; PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->nums[a]-nums[b]); for(int i = 0; i<nums.length;i++){ if(nums[i]<0){ pq.add(i); }else if(nums[i]==0){ zero=true; }else if(Math.abs(i)>Math.abs(index)){ index=i; }else{ //什么也不用做 } } if(k<=pq.size()){ while(k-->0){ nums[pq.peek()]=-nums[pq.peek()]; pq.poll(); } }else{ while(!pq.isEmpty()&&k-->0){ nums[pq.peek()]=-nums[pq.peek()]; pq.poll(); } if(!zero&&pq.size()%2==1) nums[index]=-nums[index]; } int res = 0; for(int num:nums){ res+=num; } return res; }
还有条件没过

修改之后 主要 修改 pq.size()始终为0 ,Math.abs(nums[i])比较
public int largestSumAfterKNegations(int[] nums, int k) { boolean zero=false; Integer index=0; PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->nums[a]-nums[b]); for(int i = 0; i<nums.length;i++){ if(nums[i]<0){ pq.add(i); } if(nums[i]==0){ zero=true; } if(Math.abs(nums[i])<Math.abs(nums[index])){ index=i; } } if(k<=pq.size()){ while(k-->0){ nums[pq.peek()]=-nums[pq.peek()]; pq.poll(); } }else{ while(!pq.isEmpty()&& k-->0){ nums[pq.peek()]=-nums[pq.peek()]; pq.poll(); } if(!zero&&k%2==1){ nums[index]=-nums[index]; System.out.println(nums[index]); } } int res = 0; for(int num:nums){ res+=num; } return res; }
写博客是为了让别人能明白,之后在是自己明白. 如果有不明白的地方欢迎加Q3378404370 讨论

浙公网安备 33010602011771号