数组题目: 665. 非递减数列、453. 最小移动次数使数组元素相等、283. 移动零、189. 旋转数组、396. 旋转函数

news/2024/12/31 4:05:07/

665. 非递减数列

题解:

题目要求一个非递减数列,我们可以考虑需要更改的情况:

  • nums = {4, 2, 5}

对于这个nums,由于2的出现导致非递减,更改的情况就是要么4调到<=2,要么2调到4,5.

  • nums = {1, 4, 2, 5}

对于这个nums,由于2的出现导致非递减,更改的情况就是要么4调到1,,2,要么2调到4,5.

  • nums = {3, 4, 2, 5}

对于这个nums,由于2的出现导致非递减,更改的情况就是2调到4,5.

所以算法就是:

如果按照1的情况,当i = 1,那么直接就把nums[i - 1]改成nums[i],nums[i]不动

如果按照2的情况,当nums[i - 2] < nums[i],那我们就优先考虑把nums[i - 1] 调小到 >= nums[i - 2] 并且 <= nums[i]

如果按照1的情况,nums[i - 2] > nums[i],那我们就调整nums[i],让nums[i] = nums[i - 1]。

代码:

class Solution {public boolean checkPossibility(int[] nums) {int count = 0;//统计需要满足非递减的次数for(int i = 1; i < nums.length;i++){if(nums[i] < nums[i - 1]){if(i == 1 || nums[i] >= nums[i - 2]){// i=1就是第一个情况,后面的是第二种nums[i - 1] = nums[i];}else{nums[i] = nums[i - 1];}count++;}}return count <= 1;}
}

453. 最小移动次数使数组元素相等

思路:

题目要求我们每次操作将会让n-1个元素增加1,来满足要求。我们可以反过来思考,找到最小的数,遍历其他的数,累加所有元素和最小的元素的差距。

代码:

class Solution {public int minMoves(int[] nums) {int minNum = Arrays.stream(nums).min().getAsInt();int res = 0;for(int num : nums){res += num - minNum;}return res;}
}

283. 移动零

思路:(双指针)

我们定义两个指针left, right都等于0,遍历nums,如果nums[right] != 0,那我们就让nums[left]和nums[right]进行交换,再把Left增加。如果等于0,那就让right++。

其实Left就是第一个0的位置,right就是让他找到不为0的地方。


189. 旋转数组

思路:

  • 第一步:先翻转数组里的数
  • 第二步:翻转前[0, k - 1]个数
  • 第三步:翻转后面[k, n]的数

代码:

class Solution {public void rotate(int[] nums, int k) {k %= nums.length;reverse(nums, 0, nums.length - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.length - 1);}public void reverse(int[] nums, int left, int right){while(left <= right){int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}}
}

396. 旋转函数

思路:

找规律

所以对应的公式:

F[i] = F[i - 1] + sum - n * nums[n - i];

代码:

class Solution {public int maxRotateFunction(int[] nums) {int sum = 0, f = 0, n = nums.length, ans = 0;for(int i = 0; i < n; i++){sum += nums[i];f += i * nums[i];//f(0);}ans = f;for(int i = 1; i < n; i++){f = f + sum - n * (nums[n - i]);//f[i] = f[i - 1] + sum -n * nums[n - i];ans = Math.max(ans, f);}return ans;}
}


http://www.ppmy.cn/news/1238502.html

相关文章

『亚马逊云科技产品测评』活动征文|低成本搭建物联网服务器thingsboard

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 0. 环境 - ubuntu22&#xff08;注意4G内存勉强够&#xff0c;部署完…

【matlab版本的ggplot2】

gramm (complete data visualization toolbox, ggplot2/R-like) 来源&#xff1a;Morel, Pierre. “Gramm: Grammar of Graphics Plotting in Matlab.” The Journal of Open Source Software, vol. 3, no. 23, The Open Journal, Mar. 2018, p. 568, doi:10.21105/joss.00568…

Java定时任务 ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor 的创建 ScheduledThreadPoolExecutor executorService new ScheduledThreadPoolExecutor(1, // 核心线程数new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d") // 线程命名规则.daemon(true) // 设置线程为…

C语言之strstr函数的使用和模拟实现

C语言之strstr函数的模拟实现 文章目录 C语言之strstr函数的模拟实现1. strstr函数的介绍2. strstr函数的使用3. strstr的模拟实现3.1 实现思路3.2 实现代码 1. strstr函数的介绍 函数声明如下&#xff1a; char * strstr ( const char * str1, const char * str2 ); strs…

MediaCodec详解

MediaCodec 是Android平台提供的一个API&#xff0c;用于对音频和视频数据进行编码&#xff08;转换为不同的格式&#xff09;和解码&#xff08;从一种格式转换回原始数据&#xff09;。它是Android 4.1&#xff08;API级别16&#xff09;及以上版本的一部分&#xff0c;允许开…

uniapp 打包后各静态资源加载失败的问题(背景图,字体等)

原因: 1.部署地址不在域名根目录下 解决办法(推荐办法2): 办法1.如果部署在域名的文件夹下(例如h5), 则运行的基础路径修改为/h5/ 且注意路由模式 办法2.不修改运行的基础路径(还是./), 将代码中涉及背景图(background-image)和字体资源的路径前统一加,如图: tips: 标签内s…

[网鼎杯 2020 朱雀组]phpweb

看一下源码 应该是输入的date 作为函数&#xff0c;value作为内部参数的值&#xff0c;将date()函数返回的结果显示在页面上 回去看的时候&#xff0c;意外发现页面有了新的跳转&#xff0c;观察一下发现&#xff0c;页面每隔五秒就会发生一次跳转 所以就抓包看看 抓包发现po…

DQN算法

DQN算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main DQN算法 DQN(Deep Q-Network) 主要创新点在于将Q-learning算法中的Q表记录动作价值函数转为引入深度神经网络来近似动作价值函数 Q ( s , a ) Q(s,a) Q(s,a),从而能够处理连续…