1005. K 次取反後最大化的陣列和 找到負數個數,條件判斷
阿新 • • 發佈:2021-12-23
1005. K 次取反後最大化的陣列和 找到負數個數,條件判斷
檢視原題
解題思路
主要思想就是儘量多的把負數變為正數,負數不夠變化時,變化最小的正數。
- 先將陣列排序,便於後續運算元組中的資料
- 找出陣列中負數的個數,記錄到count中,並且計算原來陣列的和記錄到sum中
- 開始判斷變化的次數和負數個數的關係
- 如果變化的次數小於等於負數的個數,k<=count,則直接找出最小的k個負數,最大和為sum + k個負數絕對值的二倍
- 如果變化的次數大於負數的個數,繼續判斷負數的個數是否為0
- 為0,則判斷k是否為偶數,如果為偶數則直接返回sum,如果為奇數,則直接返回sum - 二倍的nums[0]
- 不為0,先求出將負數全變為正數的最大值,然後求出變化次數和負數個數的差值temp,繼續判斷temp是奇數還是偶數
- temp為偶數,直接返回最大值
- temp為奇數,繼續判斷陣列是否為全負數,如果是全負數 return maxSum + 2(nums[nums.length-1]),如果不是則 return maxSum - 2Math.min(Math.abs(nums[count-1]),Math.abs(nums[count]))。
程式碼
/** * @param {number[]} nums * @param {number} k * @return {number} */ // 統計負數的個數 var largestSumAfterKNegations = function(nums, k) { let count = 0;//負數的個數 let maxSum = 0;//可能的最大和 let sum = 0;//原來的 nums.sort((a,b)=>a-b); nums.forEach(item=>{ if(item < 0){ count ++; } sum += item; }) if(k<=count){ maxSum = sum; for(let i =0;i<k;i++){ maxSum+=(-nums[i]*2); } return maxSum; }else if(k>count){ if(!count){ if(k%2===0){ return sum; }else{ return sum-2*nums[0]; } }else{ let temp = k-count; maxSum = sum; for(let i =0;i<count;i++){ maxSum+=(-nums[i]*2); } if(temp%2===0){ return maxSum; }else{ if(count === nums.length){ return maxSum + 2*(nums[nums.length-1]) }else{ return maxSum - 2*Math.min(Math.abs(nums[count-1]),Math.abs(nums[count])) } } } } };