1. 程式人生 > 其它 >1005. K 次取反後最大化的陣列和 找到負數個數,條件判斷

1005. K 次取反後最大化的陣列和 找到負數個數,條件判斷

1005. K 次取反後最大化的陣列和 找到負數個數,條件判斷

檢視原題

解題思路

主要思想就是儘量多的把負數變為正數,負數不夠變化時,變化最小的正數。

  1. 先將陣列排序,便於後續運算元組中的資料
  2. 找出陣列中負數的個數,記錄到count中,並且計算原來陣列的和記錄到sum中
  3. 開始判斷變化的次數和負數個數的關係
    • 如果變化的次數小於等於負數的個數,k<=count,則直接找出最小的k個負數,最大和為sum + k個負數絕對值的二倍
    • 如果變化的次數大於負數的個數,繼續判斷負數的個數是否為0
      1. 為0,則判斷k是否為偶數,如果為偶數則直接返回sum,如果為奇數,則直接返回sum - 二倍的nums[0]
      2. 不為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]))
				}
			}
		}
	}
};