leecode18 四数之和

在这里插入图片描述

我的思路

感觉四数之和和三数之和没什么区别,就将其转化为三数,再转换为两数,就是再三数之和外面再套一层循环而已。

  • 这个题的难点在于,这个h,i,j,k四个参数,我们如何编写代码,能够实现去重操作
    |h和i都是外层循环,我们要再循环开始要对其进行去重,j和k是内部代码和三数之和的去重方式一样。
    而i的去重和h有关,不再像是三数之和的那样,当i大于0的时候就可以去重了。
  • 这个题还有一个需要注意的地方就是这个类型转换,这个四个数的和超出了这个int的范围,所以我们需要在四数相加的地方进行强制类型转换。
public List<List<Integer>> fourSum(int[] nums, int target) {
    //感觉四数之和和三数之和没什么区别,就将其转化为三数,再转换为两数
    Arrays.sort(nums);
    int n = nums.length;
    List<List<Integer>> ans = new ArrayList<>();
    for(int h = 0; h<n-3;h++){
        if(h>0&&nums[h]==nums[h-1]){
            continue;
        }
        if((long)nums[h]+nums[h+1]+nums[h+2]+nums[h+3]>target){
            break;
        }
        if((long)nums[h]+nums[n-1]+nums[n-2]+nums[n-3]<target){
            continue;
        }
        for(int i = h+1;i<n-2;i++){
            if(i>h+1&&nums[i]==nums[i-1]){
                continue;
            }
            int j  = i+1;
            int k = n-1;
            
            while(j<k){
                long x = (long) nums[h]+nums[i]+nums[j]+nums[k];
                if(x<target){
                    j++;
                }else if(x>target){
                    k--;
                }else {
                    ans.add(Arrays.asList( nums[h],nums[i],nums[j],nums[k]));
                    j++;
                    while(j<k&&nums[j]==nums[j-1]) j++;
                    k--;
                    while(j<k&&nums[k]==nums[k+1]) k--;
                }
            }
        }
    }
    return ans;
}

灵神的思路

灵神的思路和我一样,只不过他比我多优化了,我只在h的循环中进行了优化,灵神再i的循环中也进行了优化。

for (int b = a + 1; b < n - 2; b++) { // 枚举第二个数
                long y = nums[b];
                if (b > a + 1 && y == nums[b - 1]) continue; // 跳过重复数字
                if (x + y + nums[b + 1] + nums[b + 2] > target) break; // 优化一
                if (x + y + nums[n - 2] + nums[n - 1] < target) continue; // 优化二
作者:灵茶山艾府
链接:https://leetcode.cn/problems/4sum/solutions/2344514/ji-zhi-you-hua-ji-yu-san-shu-zhi-he-de-z-1f0b/
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模与仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建与控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态与位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制与轨迹跟踪。此外,文章还提到了多种优化与控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学与科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究与对比分析; 阅读建议:建议读者结合文中提到的Matlab代码与仿真模型,动手实践飞行器建模与控制流程,重点关注动力学方程的实现与控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值