1. 数组的改变和移动总结

1.1 数组的改变

数组在内存中是一块连续的内存空间,我们可以直接通过下标进行访问,并进行修改。

Java中,对于List类型来说,我们可以通过set(idx, element)方法将idx位置的元素进行修改。

1.2 数组的移动

数组的移动不能通过一条语句来实现,通常来说需要通过:插入、删除或者多次交换来实现。

1.3 数组的插入

数组的插入比较麻烦,我们想要在下标为k的位置插入一个元素时,首先需要将k及以后的元素往后移动一个位置,然后再将元素插入到k的位置处。

Java中,对于List类型来说,我们可以通过add(idx, element)方法将元素添加到idx下标处。

1.4 数组的删除

删除下标为k的元素时,需要将k以后的元素向前移动一个位置。

对于List类型来说,我们可以通过remove(idx)方法删除下标为idx的元素。

2. 题目记录

453. 最小操作次数使数组元素相等

分析题意

给你一个长度为 n的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。

思路分析

这道题有一个很巧妙的思路:由于我们并不关心最终元素相等时的值而只关心操作的次数。所以我们可以将上述问题转化为:每次操作使一个元素减少1,返回让数组中所有元素相等的最小操作数。这样就简单了:我们想要操作数最小,就必须找到能使所有元素相等的最小值,其实这个值就是数组中的最小值。而操作的次数就是:每个数与最小值的差值之和。

class Solution {
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE; for(int i = 0; i < nums.length; i++){
min = Math.min(nums[i], min);
} int ans = 0;
for(int i = 0; i < nums.length; i++){
ans = ans + nums[i] - min;
} return ans; }
}

那么正向思考这个问题应该怎么做呢?

注意到:每次操作都使n-1个数加1,也就是所每次操作都会使该数组的sum加上n-1。假设最小操作数为a次,那么此时一定有数学关系式:\(a(n-1) + sum = nx\),其中x为最终数组中的值。

仅有这一个关系式的约束是不够的,我们还要想清楚的一点就是:原数组中最小的那个数需要操作a次才能够变为x ,即:\(min + a = x\) (这个比较难想明白)

根据这两个公式我们就可以求出最终的a了:\(a = sum - n * min\)

class Solution {
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE;
int sum = 0; for(int i = 0; i < nums.length; i++){
sum += nums[i];
min = Math.min(nums[i], min);
}
return sum - nums.length * min; }
}

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

665. 非递减数列

分析题意

给你一个长度为 n 的整数数组 nums,请你判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。

思路分析

从前往后遍历,找到第一个 a > b的情况时,对ab 的值进行修改,然后判断修改后的数组是否为非递减数组即可。关键在于:修改 a 还是 修改 b 呢?

这里其实是有两个选择的:

  1. 对于 [1, 3, 4, 2, 5] ,此时应该修改 b
  2. 对于[1, 3, 4, 3, 4], 此时应该修改 a

一种简单的方法就是:我们两种情况都尝试,看看是否能够得到非递减数组。

class Solution {
public boolean checkPossibility(int[] nums) { for(int i = 0; i < nums.length - 1; i++){
if(nums[i] > nums[i + 1]){
int n_1 = nums[i];
int n_2 = nums[i + 1]; // 修改a
nums[i] = n_2;
if(checkMethod(nums)) return true; // 复位a
nums[i] = n_1;
// 修改b
nums[i + 1] = n_1;
if(checkMethod(nums)) return true; return false;
}
}
return true;
} boolean checkMethod(int[] nums){
for(int i = 1; i < nums.length; i++){
if(nums[i - 1] > nums[i]) return false;
} return true;
}
}

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

283. 移动零

分析题意

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

关键点:保持非零元素的相对顺序。

思路分析

首先排除首尾双指针的思路,因为要保持非零元素的相对顺序,所以不能够使用首尾双指针来做。

首尾双指针是指:左指针找第一个0元素,右指针找第一个非0元素,然后交换两个元素。有点像归并排序。

由于不复制数组,所以大概率还是使用双指针来操作。分析一下,假设我们知道left左侧都是非零元素,然后在left右侧找到了一个非零元素,此时只需要将该元素放在left下标下即可。

基于此思路,我们用left来标识已经处理元素的右边界,然后通过右指针去寻找下一个非0元素,找到后放置在left位置并将left指针右移。

class Solution {
public void moveZeroes(int[] nums) {
int left = 0;
int right = 0; while(right < nums.length){
if(nums[right] != 0){
nums[left] = nums[right];
left ++;
} right ++;
} while(left < nums.length){
nums[left] = 0;
left ++;
} }
}

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

LeetCode - 数组的改变和移动的更多相关文章

  1. Leetcode数组题*3

    目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加 ...

  2. Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序

    分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...

  3. LeetCode 数组分割

    LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...

  4. LeetCode数组中重复的数字

    LeetCode 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...

  5. LeetCode数组解题模板

    一.模板以及题目分类 1.头尾指针向中间逼近 ; ; while (pos1<pos2) { //判断条件 //pos更改条件 if (nums[pos1]<nums[pos2]) pos ...

  6. LeetCode数组查找问题

    简单的二分查找法:(Leetcode704): 注意条件(low<=high) public int search(int[] nums, int target) { int low=0; in ...

  7. vue数据绑定数组,改变元素时不更新view问题

    关于这个问题,官网上说的很清楚官方文档  写个例子HTML<body> <div class="box"> <div v-for="aa i ...

  8. leetcode 数组类型题总结

    1,removeDuplicates(I) int removeDuplicatesI(vector<int>& nums){ // 重新组织数组,同 removeDuplicat ...

  9. js数组方法 改变原数组和不改变原数组的方法整理

    改变原数组: pop():   删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不 改变数组,并返回 undefined 值 ...

随机推荐

  1. jdbc 02: 连接mysql,并实现删除与更新

    jdbc连接mysql,并实现删除与更新 package com.examples.jdbc.o2_删除与更新; import java.sql.*; //连接与插入 /* jdbc删除操作 */ p ...

  2. AtCoder Beginner Contest 247 E - Max Min // 容斥原理

    原题链接:E - Max Min (atcoder.jp) 题意: 给定一个数组,求满足最大值为X且最小值为Y的区间个数. 思路:容斥原理 因为必须要包含端点,直接求是不容易的.因此考虑去求不一定包含 ...

  3. csdn 不可复制代码的解决方法

    简介 由于csdn需要登陆才可以复制,需要脚本才可以操作 脚本 直接在console控制台输入以下代码即可直接复制 $("#content_views pre").css(&quo ...

  4. PHP及相关服务器防盗链

    服务器防盗链 假设域名为www.localhost.com 1.apache配置httpd.conf SetEnvIfNoCase Referer "^http://www.localhos ...

  5. 浅淡 Apache Kylin 与 ClickHouse 的对比

    作者简介 周耀,Kyligence 解决方案架构师,Apache Kylin.Apache Superset Contributor. Apache Kylin 和 ClickHouse 都是目前市场 ...

  6. 前端React项目遇到【Uncaught SyntaxError: Unexpected token '<'】错误的解决方式

    问题描述 前端部署好项目后,打开相应的页面显示一片空白,打开console显示 问题排查思路 理解问题的本质 出现这个错误的原因是浏览器期望得到js文件,但页面却返回了html文件,如图中的js文件点 ...

  7. Excel 数学函数(一):INT、TRUNC、ROUND、ROUNDUP 和 ROUNDDOWN

    前言 INT.TRUNC.ROUND.ROUNDUP 和 ROUNDDOWN 都是对一个数进行取舍,但是,各自的取舍的方式不一样. INT 函数只有一个参数:TRUNC.ROUND.ROUNDUP 和 ...

  8. [CF1500C] Matrix Sorting (模拟)

    场上最后十几秒交上去过掉了耶! 题面 这里有两个 N ∗ M N*M N∗M 的 E x c e l \rm Excel Excel 表格 A A A 和 B B B. 我们知道 E x c e l ...

  9. python筛选excel内容并生成exe文件

    最近疫情原因,班级每天都要筛选未打卡人员,每次都手动操作太麻烦了.遂写下如下的程序,并且生成了exe可执行文件. 1. 主程序 import openpyxl import pyperclip # 1 ...

  10. KingbaseES 行列转换函数

    关键字:    行专列,列转行, pivot, unpivot 行列转换是在数据分析中经常用到的一项功能,KingbaseES从V8R6C3B0071版本开始通过扩展插件(kdb_utils_func ...