/*189、轮转数组*/
/*思路一:
* 先把整体reverse,再把前k部分reverse,最后把后n-k部分reverse
* 原理是把先把两个部分的相对位置转变,再把两个部分的内部相对位置转变
* 注意:有可能要翻转次数大于数组长度,这样就可能报溢出,比如[-1,-2] 3,但是这样反转三次和反转一次效果是一样的,所以可以直接取模得到一个比较小但是效果相同的翻转次数
* */
/*通过*/
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
int l = 0, r = n - 1;
reverseRotate(nums, l, r);
reverseRotate(nums, 0, k - 1);
reverseRotate(nums, k, r);
}
public void reverseRotate(int[] nums, int l, int r) {
while (l < r) {
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
l++;
r--;
}
}
/*!!!396、旋转函数*/
/*思路:
* 找规律
* f(0) = 0 * nums[0] + 1 * nums[1] + 2 * nums[2] +...+ n-1 * nums[n - 1]
* f(1) = 1 * nums[0] + 2 * nums[1] + 3 * nums[2] +...+ 0 * nums[n - 1]
* 可以发现上下是对应的,f(1)-f(0) = nums[1] + nums[2] + nums[3] +... -(n-1) * nums[n-1]
* 设sum为数组元素之和,那么f(1) = f(0) + sum - n * nums[n - 1] (因为sum中是包含一个nums[n-1]的,所以我们多加了一个,当然得减去,所以原本的-(n-1)改为-(n-1+1)即-n)
* 再看
* f(2) = 2 * nums[0] + 3 * nums[1] + 4 * nums[2] +...+ 0 * nums[n-2] + 1 * nums[n - 1]
* = f(1) + sum - n * nums[n - 2] (f(1)nums[n-2]对应的是n-1)
* 所以的得到f(k) = f(k-1) + sum - n * nums[n - k]
*/
public int maxRotateFunction(int[] nums) {
int n = nums.length;
int sum = Arrays.stream(nums).sum();
int f = 0;
for (int i = 0; i < nums.length; i++) {
f += nums[i] * i;//此时f就是f(0)
}
int res = f;
for (int i = n - 1; i > 0; i--) {
f += sum - n * nums[i];
res = Math.max(f, res);
}
return res;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix