力扣打卡day08——轮转数组、除自身外乘积

189. 轮转数组 - 力扣(LeetCode)

思路

输入: nums = [1,2,3,4,5,6,7], k = 3

输出: [5,6,7,1,2,3,4]

解释:

当k 等于nums.length时,数组没变,所以要取模

1,2,3,4,5,6,7\] 反转一次 \[7,6,5,4,3,2,1

对前k 个反转

5,6,7,4,3,2,1

对剩下的反转

5,6,7, 1,2,3,4

复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        //这个就是反转三次就行
        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 start,int end){
        while(start<end){
            int tmp=nums[start];
            nums[start]=nums[end];
            nums[end]=tmp;
            start++;
            end--;
        }
    }
}

238. 除了自身以外数组的乘积 - 力扣(LeetCode)

第一个循环使用数组ans[]来存储每个元素左侧元素乘积(从最左侧开始,每次往右乘一个数)。

第二个循环不使用数组存储值,直接使用一个变量temp计算右侧元素乘积(从最右侧元素开始,每次往左乘一个数)。然后直接用ans[]*temp来计算最终结果,每一轮计算出temp就计算使用掉然后下一轮更新。

最终就只用到两个单层循环和一个数组。

原数组: [1 2 3 4]

左部分的乘积: 1 1 1*2 1*2*3

右部分的乘积: 2*3*4 3*4 4 1

结果: 1*2*3*4 1*3*4 1*2*4 1*2*3*1

复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n=nums.length;
        if(n==0) return nums;
        int ans[]=new int[n];
        int tmp=1;
        ans[0]=1;
        //计算左边的乘积
        for(int i=1;i<n;i++){
            ans[i]=ans[i-1]*nums[i-1];
        }
        //计算右边的乘积
        for(int i=n-2;i>=0;i--){
            tmp*=nums[i+1];
            ans[i]*=tmp;
        }
        return ans;
    }
}
相关推荐
海砥装备HardAus几秒前
飞控算法中双环串级PID深度解析:角度环与角速度环的协同机制
stm32·算法·无人机·飞控·串级pid
宵时待雨1 分钟前
优选算法专题1:双指针
数据结构·c++·笔记·算法·leetcode
zsc_1183 分钟前
pvz3解码小游戏求解算法
算法
汀、人工智能5 分钟前
[特殊字符] 第107课:LRU缓存(最后一课[特殊字符])
数据结构·算法·链表·数据库架构·哈希表·lru缓存
数据知道10 分钟前
claw-code 源码分析:结构化输出与重试——`structured_output` 一类开关如何改变「可解析性」与失败语义?
算法·ai·claude code·claw code
tankeven11 分钟前
HJ172 小红的矩阵染色
c++·算法
2301_8227032015 分钟前
Flutter 框架跨平台鸿蒙开发 - 智能植物生长记录应用
算法·flutter·华为·harmonyos·鸿蒙
每日任务(希望进OD版)20 分钟前
线性DP、区间DP
开发语言·数据结构·c++·算法·动态规划
放羊郎25 分钟前
机器人跟随算法
算法·机器人
Tong Z25 分钟前
Buffer Pool的数据结构
数据结构