数组左旋转后查找最大值元素的索引位置
解决方案:无需实际旋转数组,直接计算最大值索引
我来帮你搞定这个需求——其实完全不用真的去旋转数组(尤其是数组很大的时候,旋转操作既费内存又没必要),咱们用数学计算就能直接得出结果,效率拉满。
核心思路是抓住「左旋转的本质是元素位置的循环移动」,步骤拆解如下:
- 步骤1:先找到原数组中最大值的初始索引(如果有多个相同最大值,这里默认取第一个出现的;需要取最后一个的话,后面会说调整方法)
- 步骤2:计算有效旋转次数:因为旋转数组长度
n次后,数组会回到初始状态,所以用k % n去掉多余的循环旋转 - 步骤3:用公式计算新索引:
(初始索引 - 有效旋转次数) % 数组长度,这个公式会自动处理负数情况,返回正确的正索引
代码示例(Python)
def find_max_index_after_left_rotation(arr, k): n = len(arr) if n == 0: return -1 # 处理空数组的边界情况 # 找到最大值的第一个出现索引 max_value = max(arr) original_max_idx = arr.index(max_value) # 计算实际需要旋转的次数(去掉循环的部分) effective_rotations = k % n # 计算旋转后的新索引 new_max_idx = (original_max_idx - effective_rotations) % n return new_max_idx # 测试你的示例 test_array = [5, 7, 1, 8, 2] print(find_max_index_after_left_rotation(test_array, 2)) # 输出1,符合预期 print(find_max_index_after_left_rotation(test_array, 6)) # 输出2,符合预期
公式原理验证
拿你给的第二个示例拆解:
- 数组长度
n=5,旋转6次的有效次数是6%5=1 - 最大值8的初始索引是3
- 计算:
(3 - 1) % 5 = 2,和示例结果完全一致
再试个极端情况:旋转5次(等于没旋转),有效次数0,新索引就是3,和原位置一致,正确;旋转8次(有效次数3),(3-3)%5=0,对应左旋转3次后的数组[8,2,5,7,1],8确实在索引0,没问题。
处理多个最大值的情况
如果数组里有多个相同的最大值(比如[8,5,8,2]),想要取最后一个最大值的初始索引,只需要把找索引的代码改成:
original_max_idx = len(arr) - 1 - arr[::-1].index(max_value)
再代入公式计算就能得到最后一个最大值旋转后的位置。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

