funmaxSubArray(nums: IntArray): Int { var result = 0 var maxResult = Int.MIN_VALUE for (pIndex in nums.indices) { result += nums[pIndex] maxResult = maxResult.coerceAtLeast(result) if (result < 0) { result = 0 } } return maxResult }
funmaxProfit(prices: IntArray): Int { val diffArray = IntArray(prices.size - 1) for (i in1 until prices.size) { println(i) diffArray[i - 1] = prices[i] - prices[i - 1] } var sum = 0 for (i in diffArray.indices) { if (diffArray[i] > 0) { sum += diffArray[i] } } return sum }
funcanJump(nums: IntArray): Boolean { var coverArea = 0 for (i in0..coverArea) { // 注意:这里是coverArea,需要确定能走多少步 coverArea = (i + nums[i]).coerceAtLeast(coverArea) //新的范围和 之前的范围做比较 if (coverArea >= nums.size - 1) { returntrue } } returnfalse }
45 跳跃游戏 II
Idea
题目意思 总是可以到达数组的最后一个位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
funjump(nums: IntArray): Int { var maxCover = 0 var count = 0 for (i in0..maxCover) { if (i + nums[i] > maxCover) { maxCover = i + nums[i] } else { count++ }
funjump(nums: IntArray): Int { var nextCover = 0 var count = 0 var currentCover = 0 for (i in0 until nums.size - 1) { nextCover = Math.max(i + nums[i], nextCover) if (i == currentCover) { currentCover = nextCover count++ } } return count }
funlargestSumAfterKNegations(nums: IntArray, k: Int): Int { Arrays.sort(nums) var balanceK = 0 for (i in0 until k) { // kotlin用while 应该更好 if (i >= nums.size || nums[i] > 0) { balanceK = k - i break } nums[i] = Math.abs(nums[i]) } Arrays.sort(nums) if (balanceK > 0 && (balanceK % 2) > 0) { nums[0] = -nums[0] } var sum = 0 for (value in nums) { sum += value } return sum }
funlargestSumAfterKNegations(nums: IntArray, k: Int): Int { val typedArray = nums.toTypedArray() // 转成数组 Arrays.sort(typedArray, Comparator.comparingInt(Math::abs)) // 按照绝对值排序 var k = k for (i in typedArray.indices) { if (k > 0 && typedArray[i] < 0) { // 碰到数组中>0的数 typedArray[i] *= -1 k-- } } Arrays.sort(typedArray) if (k % 2 > 0) { typedArray[0] *= -1 } var sum = 0 for (value in nums) { sum += value } return sum }
funcanCompleteCircuit(gas: IntArray, cost: IntArray): Int { for (i in gas.indices) { var balance = gas[i] - cost[i] var index = (i + 1) % gas.size while (balance > 0 && i != index) { // 还有油的话,没走完一圈,继续走 balance += (gas[index] - cost[index]) index = (index + 1) % gas.size } if (balance >= 0 && (index == i)) {//走完一圈,返回下标 return i } } return -1 }
The solution sorts the balloons by their end positions in ascending order, and then uses a greedy algorithm to shoot the balloons. We start with the first balloon and set end to its end position. Then, we iterate through the rest of the balloons and compare their start positions to end. If the start position of a balloon is greater than end, we shoot another arrow and update end to the end position of the current balloon.
At the end, the function returns the number of arrows shot.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
funfindMinArrowShots(points: Array<IntArray>): Int { if (points.isEmpty()) return0 points.sortBy { it[1] } var arrows = 1 var end = points[0][1]
for (i in1 until points.size) { if (points[i][0]>end) { arrows++ end = points[i][1] } }
funeraseOverlapIntervals(intervals: Array<IntArray>): Int { if(intervals.isEmpty()) return0 var count = 0 Arrays.sort(intervals) { a, b -> a[0] - b[0] } // 按照左边数组进行排序 var end = intervals[0][1] for (i in1 until intervals.size) { if (intervals[i][0] < end) { //重合的情况 count++ end = end.coerceAtMost(intervals[i][1]) // 确定最小重合的 右边界, 这里一开始弄错了 } else { end = intervals[i][1] } } // intervals.printDimensionalArray() return count }
funeraseOverlapIntervals(intervals: Array<IntArray>): Int { if (intervals.isEmpty()) return0 var count = 1//非交叉区间个数 Arrays.sort(intervals) { a, b -> a[1] - b[1] } // 按照左边数组进行排序 var end = intervals[0][1] for (i in1 until intervals.size) { if (intervals[i][0] >= end) { count ++ end = intervals[i][1] } // else{ // end = intervals[i][1].coerceAtMost(end) // 这个不需要 // } } // intervals.printDimensionalArray() return intervals.size - count }
12
763 划分字母区间
idea
遍历出每个字母的最远距离,出现的座标。
根据字母的hash值得到当前的座标,后面如果有重复的hash,会覆盖前面的。
遍历后序列找 当前字母hash值 == i , right = i 拿到当前 right + 1 - left, 就是片段的长度。
然后更新left值.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funpartitionLabels(s: String): List<Int> { val result = arrayListOf<Int>() val hash = IntArray(26) for (i in s.indices) { hash[s[i] - 'a'] = i }
var left = 0 var right = 0 for (i in s.indices) { right = hash[s[i] - 'a'].coerceAtLeast(right) // 要找到当前hash值的最大值 if (right == i) { //如果 hash值的最大值 和座标相等,就用到了分割点 result.add(right + 1 - left) left = i + 1 } } // hash.printIntArray() return result }
funmerge(intervals: Array<IntArray>): Array<IntArray> { Arrays.sort(intervals) { a, b -> a[0] - b[0] } var left = intervals[0][0] var right = intervals[0][1] val arrayOf = arrayListOf<IntArray>() for (i in1 until intervals.size) { if (intervals[i][0] <= right) { right = right.coerceAtLeast(intervals[i][1]) } else { arrayOf.add(intArrayOf(left, right)) left = intervals[i][0] right = intervals[i][1] } } arrayOf.add(intArrayOf(left, right)) return arrayOf.toTypedArray() }
funmonotoneIncreasingDigits(n: Int): Int { val arrStr = n.toString().toCharArray() for (i in arrStr.size - 1 downTo 1) { if (arrStr[i - 1] > arrStr[i]) { arrStr[i] = '9' arrStr[i - 1] = arrStr[i - 1].toInt().minus(1).toChar() } } return String(arrStr).toInt() }
100 跑完后变成90,其实后面所有位都要变成 ‘9’,只有当前位减1
找到 minus 1 的位置,后面的位都变成9
1 2 3 4 5 6 7 8 9 10 11 12 13 14
funmonotoneIncreasingDigits(n: Int): Int { val arrStr = n.toString().toCharArray() var position = arrStr.size //初始位置不能是 arrStr.size - 1 ,否则最后一位都会变成 '9' for (i in arrStr.size - 1 downTo 1) { if (arrStr[i - 1] > arrStr[i]) { arrStr[i - 1] = arrStr[i - 1].toInt().minus(1).toChar() // digitToInt leetcode跑不了 position = i // 找到-1 的位置,后面的位都变成9 } } for (i in position until arrStr.size) { arrStr[i] = '9' } return String(arrStr).toInt() }