Leetcode-Array-57(insert Interval)

本文介绍了一种在已排序的不重叠区间中插入新区间并进行必要合并的算法。通过两个示例展示了算法的工作原理,并提供了两种实现方式的C++代码:一种是不带主函数的实现,另一种则是完整的程序实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

给定一组不重叠的间隔,在间隔中插入一个新的间隔(如有必要,合并)。

您可以假设间隔最初按照起始时间进行排序。

示例1:
给定间隔[1,3],[6,9],插入和合并[2,5][1,5],[6,9]

示例2:
给定[1,2],[3,5],[6,7],[8,10],[12,16],插入并合并[4,9][1,2],[3,10],[12,16]

这是因为新的间隔[4,9]与之重叠[3,5],[6,7],[8,10]

 

/**

 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}

 

 

 * };

 

*/

当然,leetcode拥有良好的函数处理平台,但有时候我想知道如何编写出来一个完整的程序,现在我给出一种编写方法吧。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
    vector<Interval> ret;
        if(intervals.empty())
        {
            ret.push_back(newInterval);
            return ret;
        }
            
        int i = 0;
        while(i < intervals.size())
        {
            //no overlapping
            if(newInterval.end < intervals[i].start)
            {
                ret.push_back(newInterval);
                while(i < intervals.size())
                {
                    ret.push_back(intervals[i]);
                    i ++;
                }
                return ret;
            }
            else if(newInterval.start > intervals[i].end)
                ret.push_back(intervals[i]);
            //overlapping
            else
            {
                newInterval.start = min(newInterval.start, intervals[i].start);
                newInterval.end = max(newInterval.end, intervals[i].end);
            }
            i ++;
        }
        ret.push_back(newInterval);      
        return ret;
    }
};

这个是没有主函数的。

 

 

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

class Solution {
public:
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        vector<Interval> ret;
        if(intervals.empty())
        {
            ret.push_back(newInterval);
            return ret;
        }
        
        int i = 0;
        while(i < intervals.size())
        {
            //no overlapping
            if(newInterval.end < intervals[i].start)
            {
                ret.push_back(newInterval);
                while(i < intervals.size())
                {
                    ret.push_back(intervals[i]);
                    i ++;
                }
                return ret;
            }
            else if(newInterval.start > intervals[i].end)
                ret.push_back(intervals[i]);
            //overlapping
            else
            {
                newInterval.start = min(newInterval.start, intervals[i].start);
                newInterval.end = max(newInterval.end, intervals[i].end);
            }
            i ++;
        }
        ret.push_back(newInterval);
        return ret;
    }
};
int main()
{
    Interval temp;
    Interval temp1;
    vector<Interval> vec;
    for(int i = 0; i < 5; i++) {
        cin >> temp.start >> temp.end;
        vec.push_back(temp);
    }
    cin >> temp1.start >> temp1.end;
    Solution sol;
    vector<Interval>ans = sol.insert(vec,temp1);
    for(int i = 0; i < ans.size(); i++) {
        cout << ans[i].start << ' ' << ans[i].end << endl;
    }
    return 0;
}

这个是完整的。 //已经运行过的

2020.05.31

#这道题的思想是这样:是在给定区间内加入一个新的区间,如果该区间可以和原给定区间融合的话,那就融合,最后给出融合后的新区间。

给定区间是按照顺序排好的区间,所以这里需要考虑的情况是:

#当新区间的结束时间小于循环中区间的开始时间的话,说明该区间范围
我原来代码感觉写的逻辑性不好,

这里应该先判断新区间的开始时间是否大于原区间中循环到的区间的结束时间,如果大于的话,说明原区间循环中的这一个就是可以加入容器的区间。

接着开始判断下一个区间和新区间。

可能写的不是很清楚,大家看代码调试吧

接着开始判断新区间的结束时间与循环区间的开始时间的对比,感觉逻辑没有理清,我重试着写一下

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> ans;
       // bool flag = false;        //新区间是否放置进答案
        for(int i = 0; i < intervals.size(); i++){
            if(newInterval[0] > intervals[i][1]){
                ans.push_back(intervals[i]);
                //cout<<ans[0][0]<<endl;
                //cout<<newInterval[0] <<" "<<intervals[i][1]<<endl;
                //continue;
            }
            else if(newInterval[1] < intervals[i][0]){
                //这样是和同一个区间的开始与结束相比
                //cout<<newInterval[0] <<" "<<intervals[i][1]<<endl;
                ans.push_back(newInterval);
                for(; i < intervals.size(); i++)
                    ans.push_back(intervals[i]);
                return ans;
            }
            else {
                newInterval[0] = min(newInterval[0], intervals[i][0]);  //区间合并
                newInterval[1] = max(newInterval[1], intervals[i][1]);
            }
        }
        //cout<< newInterval[0]<<" "<<newInterval[1]<<endl;
        ans.push_back(newInterval);
        return ans;
    }
};

 

至于最后为什么会再添加一个新区间呢?这是因为for循环的是原有区间个数,如果新区间的开始时间大于所有原区间的再大结束时间,就需要在容器最后添加新区间。



 

1. Two Sum 2. Add Two Numbers 3. Longest Substring Without Repeating Characters 4. Median of Two Sorted Arrays 5. Longest Palindromic Substring 6. ZigZag Conversion 7. Reverse Integer 8. String to Integer (atoi) 9. Palindrome Number 10. Regular Expression Matching 11. Container With Most Water 12. Integer to Roman 13. Roman to Integer 14. Longest Common Prefix 15. 3Sum 16. 3Sum Closest 17. Letter Combinations of a Phone Number 18. 4Sum 19. Remove Nth Node From End of List 20. Valid Parentheses 21. Merge Two Sorted Lists 22. Generate Parentheses 23. Swap Nodes in Pairs 24. Reverse Nodes in k-Group 25. Remove Duplicates from Sorted Array 26. Remove Element 27. Implement strStr() 28. Divide Two Integers 29. Substring with Concatenation of All Words 30. Next Permutation 31. Longest Valid Parentheses 32. Search in Rotated Sorted Array 33. Search for a Range 34. Find First and Last Position of Element in Sorted Array 35. Valid Sudoku 36. Sudoku Solver 37. Count and Say 38. Combination Sum 39. Combination Sum II 40. First Missing Positive 41. Trapping Rain Water 42. Jump Game 43. Merge Intervals 44. Insert Interval 45. Unique Paths 46. Minimum Path Sum 47. Climbing Stairs 48. Permutations 49. Permutations II 50. Rotate Image 51. Group Anagrams 52. Pow(x, n) 53. Maximum Subarray 54. Spiral Matrix 55. Jump Game II 56. Merge k Sorted Lists 57. Insertion Sort List 58. Sort List 59. Largest Rectangle in Histogram 60. Valid Number 61. Word Search 62. Minimum Window Substring 63. Unique Binary Search Trees 64. Unique Binary Search Trees II 65. Interleaving String 66. Maximum Product Subarray 67. Binary Tree Inorder Traversal 68. Binary Tree Preorder Traversal 69. Binary Tree Postorder Traversal 70. Flatten Binary Tree to Linked List 71. Construct Binary Tree from Preorder and Inorder Traversal 72. Construct Binary Tree from Inorder and Postorder Traversal 73. Binary Tree Level Order Traversal 74. Binary Tree Zigzag Level Order Traversal 75. Convert Sorted Array to Binary Search Tree 76. Convert Sorted List to Binary Search Tree 77. Recover Binary Search Tree 78. Sum Root to Leaf Numbers 79. Path Sum 80. Path Sum II 81. Binary Tree Maximum Path Sum 82. Populating Next Right Pointers in Each Node 83. Populating Next Right Pointers in Each Node II 84. Reverse Linked List 85. Reverse Linked List II 86. Partition List 87. Rotate List 88. Remove Duplicates from Sorted List 89. Remove Duplicates from Sorted List II 90. Intersection of Two Linked Lists 91. Linked List Cycle 92. Linked List Cycle II 93. Reorder List 94. Binary Tree Upside Down 95. Binary Tree Right Side View 96. Palindrome Linked List 97. Convert Binary Search Tree to Sorted Doubly Linked List 98. Lowest Common Ancestor of a Binary Tree 99. Lowest Common Ancestor of a Binary Search Tree 100. Binary Tree Level Order Traversal II
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值