粗暴解法:平移后的位置可以根据平移偏移量计算,显然,对于nums[i],其平移后的位置为 (i+offer)% nums.size (偏移量 offer = k % nums.size)
fun rotate(nums: IntArray, k: Int): Unit {
val offer = k % nums.size
val temp = nums.clone()
for (i in 0 ..nums.lastIndex){
nums[(i + offer) % temp.size] = temp[i]
}
}
显然 对于一道mid 的题目有些过于简单,上述解法的空间复杂度是n,要求为1
思路分析 : 上述解法造成空间浪费的原因在于元素覆盖,那么降低空间的复杂度的方法就是在覆盖元素前将其放在应该放的位置上,如果平移k个单位, 那么 这种方法计算完成后只能变化 2k 个位置,从而引来新的问题:.nums.size > 2k 与 nums.size > 2k 时,其余元素与重复元素怎么处理?
很显然,这种方法控制复杂,很容易出现问题,为追求降低空间的复杂度而采用这种方法属于捡了芝麻丢了西瓜
空间复杂度为1的解法:从leetcode题解中看到:翻转法,反转可代替平移的本质暂时未理解透彻,只能简单概括为反转可简化平移
fun rotate(nums: IntArray, k: Int): Unit {
val offer = k % nums.size
nums.reverse()
nums.reverse(0 , offer)
nums.reverse(offer,nums.size)
}
总结: 翻转代平移
关于我 : 一个希望友友们能提出建议,热衷于在代码下毒的糕手