刷题笔记 day6

这篇具有很好参考价值的文章主要介绍了刷题笔记 day6。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

力扣 57 和为s的两个整数

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>  v;
        int i =0 , j = nums.size()-1;
        while(i < j)
        {
            if(nums[i]+ nums[j] > target)
            {
                --j;
            }else if(nums[i] + nums[j] < target)
            {
                ++i;
            }else{
                v.push_back(nums[i]);
                v.push_back(nums[j]);
                break;
            }
        }
        return v;
    }
};

 对于一个递增排序的数组,我们可以使用双指针;

定义指针 left 指向数组最左端元素 , 定义指针 right 指向数组最右端元素;

当 nums[left] + nums[right]  >  target 时,右移指针right;

当 nums[left] + nums[right]  < target 时,左移指针left;

当 nums[left] + nums[right]  ==  target 时,输出结果。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>  v;
        int i =0 , j = nums.size()-1;
        while(i < j)
        {
            if(nums[i]+ nums[j] > target)
            {
                --j;
            }else if(nums[i] + nums[j] < target)
            {
                ++i;
            }else{
                v.push_back(nums[i]);
                v.push_back(nums[j]);
                break;
            }
        }
        return v;
    }
};

力扣 15 三数之和

刷题笔记 day6,数据结构,C++,笔记,leetcode,数据结构

 

思路:1. 先给数组排序(升序)

2.  固定 最右端的数 a;

3.  将数a左边的区间两端定义双指针 left 和 right , 求这三个数(a, nums[left],nums[right)之和是否等于0; 大于0 , 右移right ; 小于 0 ,左移 left.

由于输出结果中不能含有重复性元素,所以在算法过程中要去重。

1.  找到一种结果后 , left 和 right 要跳过 重复元素。

2.  使用完一次双指针后, 下一次固定的数不能重复。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        //先排序
        sort(nums.begin(),nums.end());
        vector<vector<int>> v;
        int c = nums.size()-1;
        while( c>=2)
        {
            if(nums[c] < 0) // 如果最大的数小于0,那么将不存在三个数之和为零的情况
            {
                return v;
            }
            int left = 0, right = c-1;
            while(left < right)
            {
                if(nums[left]+nums[right]+nums[c] >0)
                {
                    --right;
                }else if(nums[left]+nums[right]+nums[c] <0){
                    ++left;
                }else{
                    v.push_back({nums[left],nums[right],nums[c]});
                    ++left;
                    while(left < right&& nums[left] == nums[left-1])  //left不能越界
                    {
                        ++left;
                    }
                    --right;
                    while(left < right && nums[right] == nums[right+1])//right不能越界
                    {
                        --right;
                    }
                }
            }
            --c;
            while(c >= 2 && nums[c] == nums[c+1]) //c不能越界
            {
                --c;
            }
        }
        return v;
      }
};

 力扣  18 四数之和

刷题笔记 day6,数据结构,C++,笔记,leetcode,数据结构

 思路:

   这道题的解题方法和上一道题一样。文章来源地址https://www.toymoban.com/news/detail-636496.html

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> v;
        int c = nums.size()-1;
        while(c>=3)
        {
            int  b = c-1;
            while(b>=2)
            {
                int left = 0 , right  = b-1;
                while(left < right)
                {
                    long long sum =(long long) nums[left] + nums[right] + nums[b] + nums[c];
                    if(sum > target)
                    {
                        --right;
                    }else if(sum < target)
                    {
                        ++left;
                    }else{
                        v.push_back({nums[left],nums[right],nums[b],nums[c]});
                        ++left;
                        while(left < right && nums[left] == nums[left-1])
                        {
                            ++left;
                        }
                        --right;
                        while(left < right && nums[right] == nums[right +1])
                        {
                            --right;
                        }
                    }
                }
                --b;
                while(b >=2 && nums[b] == nums[b+1])
                {
                    --b;
                }
            }
            --c;
             while(c >=3 && nums[c] == nums[c+1])
                {
                    --c;
                }
        }
        return v;
    }
};

到了这里,关于刷题笔记 day6的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 刷题 数据结构 链表 203 移除链表元素

    Given the  head  of a linked list and an integer  val , remove all the nodes of the linked list that has  Node.val == val , and return  the new head . Example 1: Example 2: Example 3: Constraints: The number of nodes in the list is in the range  [0, 104] . 1 = Node.val = 50 0 = val = 50 今天leetcode的中文官网比较卡,所以是登录官网进行

    2024年02月14日
    浏览(36)
  • LeetCode 刷题 数据结构 数组 485 最大连续1的个数

    给定一个二进制数组  nums  , 计算其中最大连续  1  的个数。 示例 1: 示例 2: 提示: 1 = nums.length = 105 nums[i]  不是  0  就是  1.   参看bilibli视频-up主 爱学习的饲养员,讲解的很清晰。 手把手带你刷Leetcode力扣|各个击破数据结构和算法|大厂面试必备技能【已完结】-

    2024年02月15日
    浏览(51)
  • java数据结构与算法刷题-----LeetCode283. 移动零

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 双指针,用right和left两个指针,将非0元素,全部按顺序换到数组前面。left指向左边非0元素应该插入的位置,right找到非

    2024年01月21日
    浏览(49)
  • java数据结构与算法刷题-----LeetCode566. 重塑矩阵

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 代码:时间复杂度O(r*c).除题目要求外,算法本身没有需要额外空间,空间复杂度O(1) 从0开始算,一个3列n行矩阵中,每行就有3个元

    2024年01月21日
    浏览(46)
  • Leetcode刷题---C语言实现初阶数据结构---单链表

    删除链表中等于给定值 val 的所有节点 给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [ ], val = 1 输出:[ ] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:

    2024年02月15日
    浏览(57)
  • java数据结构与算法刷题-----LeetCode287. 寻找重复数

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 弗洛伊德判圈法,也就是快慢指针判圈法(龟兔赛跑算法),此算法分为两个步骤 判断是否有环,并得到快慢指针相遇

    2024年01月24日
    浏览(43)
  • 数据结构刷题笔记

    通常从四个方面评价算法的质量: 可读性 、 正确性 、 健壮性 、 高效性 。 某算法时间复杂度为O(n*n),说明算法执行时间与n *n成正比,其中n是问题规模 逻辑结构主要从数据元素之间的 相邻关系 考虑。用B=(D,R)表示,其中B表示一种逻辑数据结构,D是数据元素的集合,R是所

    2024年01月25日
    浏览(41)
  • java数据结构与算法刷题-----LeetCode766. 托普利茨矩阵

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题只要换一种理解方式,瞬间就会变的很简单。 题目描述是每个元素左上和右下对角线元素都相同。但是,我们发

    2024年01月25日
    浏览(48)
  • java数据结构与算法刷题-----LeetCode667. 优美的排列 II

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 题目要求我们返回一个数组长度为n的数组,必须含有1~n的所有数,并且从左到右,相邻的元素依次相减,它们的差,必

    2024年01月25日
    浏览(52)
  • java数据结构与算法刷题-----LeetCode240. 搜索二维矩阵 II

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 法一:把整个数组遍历一遍,时间复杂度O(m*n) 法二:每一行用二分搜索,那么时间复杂度就是O(m * l o g 2 n log_2{n} l o g

    2024年01月22日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包