当前位置: 首页 > news >正文

LeetCode面试经典150题—旋转数组—LeetCode189

原题请见:Leetcode189-旋转数组

1、题目描述

请添加图片描述

2、题目分析

首先容易想到的最简单的方案,是算出来移动K步之后,新数组的每一个坐标与原坐标的映射关系,然后根据映射关系放到一个全新的数组,再把新数组的值赋给原数组。

但题目描述的进阶方案,我们应该考虑使用 O(1) 复杂度实现。
这里不啰嗦,直接说结论:

任何有关数组的旋转、对称、平移的题目,优先去把题目转换成几次基本的对称。
大多数情况下都能通过有限次的对称解决。

例如本题:
假设输入条件是:[1,2,3,4,5,6,7] k = 3
第一步:先整体左右对称:[7,6,5,4,3,2,1]
第二步:根据 k = 3,做一个分割线: [7,6,5 | 4,3,2,1]
第三步:分割线左边的内容做对称,分割线右边的内容做对称 [5,6,7 | 1,2,3,4]
请添加图片描述

3、题解

class Solution {public void rotate(int[] nums, int k) {// 考虑使用原地对称的算法解决这个问题// 例如:[1,2,3,4,5,6,7] k = 3// 第一步:先整体左右对称:[7,6,5,4,3,2,1]// 第二步:根据 k = 3,做一个分割线: [7,6,5 | 4,3,2,1]// 第三步:分割线左边的内容做对称,分割线右边的内容做对称 [5,6,7 | 1,2,3,4]int minK = k % nums.length;symmetrized(nums, 0, nums.length - 1);symmetrized(nums, 0 , minK - 1);symmetrized(nums, minK, nums.length - 1);}private void symmetrized(int[] nums, int start, int end) {int mid = (start + end + 1) / 2;for (int i = 0; i + start< mid; i++) {int temp = nums[start + i];nums[start + i] = nums[end - i];nums[end - i] = temp;}}
}

相关文章:

  • 数据结构 学习 图 2025年6月14日 12点57分
  • linux开机原理以及如何开关机-linux023
  • 基于ssm专利服务系统微信小程序源码数据库文档
  • React 第三方状态管理库的比较与选择
  • Spring中观察者模式的应用
  • UE5反射系统分析(一)generated.h
  • uniapp 腾讯地图服务
  • 1.0 前言(Python系列教程)
  • 面试问题总结——关于C++(四)
  • spring如何处理bean的循环依赖
  • java面试总结-20250610
  • 开疆智能ModbusTCP转Devicenet网关连接FANUC机器人配置案例
  • Elasticsearch高效文章搜索实践
  • RLHF调参实战手册:实用Trick、现象排查与解决思路(持续更新)
  • 【CSS-14】深入解析CSS定位:从基础到高级应用
  • 数据库期末
  • 19 - SAFM模块
  • 共享项目中使用Wpf和Winform——c# CAD二次开发
  • 拓扑推理:把邻接矩阵和节点特征形式数据集转换为可以训练CNN等序列模型的数据集
  • 展开说说Android之Glide详解_源码解析
  • 扫码进入网站 怎么做/个人怎么注册自己的网站
  • 衡阳网站建设/今日网站收录查询
  • 卓智网络科技有限公司/南宁seo服务优化
  • 围上如何做快递查单网站/百度搜索引擎的优缺点
  • 那个平台的网页游戏好玩/baiduseoguide
  • 网站目录不能访问/百度线上推广