leetcode(81-85)

19 篇文章 0 订阅

81. 搜索旋转排序数组 II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false

示例 1:

输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true

示例 2:

输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int begin = 0;
        int end = nums.size() -1;
        int i=0;
        
        while(begin <= end){
            for(i=begin; i<end && nums[i]==nums[i+1];i++);
            begin=i;
            for(i=end; i>begin && nums[i]==nums[i-1];i--);
            end=i;
            int mid = (begin+ end)/2;
            if(target == nums[mid])
                return true;
            else if(target < nums[mid]){
                if(nums[begin] < nums[mid]){
                    if(target >= nums[begin]){
                        end = mid -1;
                    }else{
                        begin = mid + 1;
                    }
                }else if(nums[begin] > nums[mid]){
                    end = mid -1;
                }else if(nums[begin] == nums[mid]){
                    begin = mid + 1;
                }
            }else if(target > nums[mid]){
                if(nums[begin] < nums[mid]){
                    begin = mid + 1;
                }else if(nums[begin] > nums[mid]){
                    if(target >=nums[begin]){
                       end = mid -1; 
                    }else{
                        begin = mid +1;
                    }
                }else if(nums[begin] == nums[mid])
                    begin = mid + 1;
            }
        }
        return false;        
    }
};

82. 删除排序链表中的重复元素 II

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head == NULL) return head;
        double tmp=1.2;
        ListNode* dummy = new ListNode(0);
        ListNode* s=dummy;
        while(head!=NULL && head->next!=NULL){
            if(head->val == head->next->val) tmp=head->val;
            if(head->val!=tmp){
                ListNode* tp = new ListNode(head->val);
                s->next=tp;
                s=s->next;
            }
            head=head->next;
        }
        if(head->val != tmp){
            ListNode* tp = new ListNode(head->val);
            s->next=tp;
            s=s->next;
        }
        return dummy->next;
    }
};

83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2

示例 2:

输入: 1->1->2->3->3
输出: 1->2->3
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head == NULL) return head;
        ListNode* resHead = head;
        while(head->next != NULL){
            if(head->val == head->next->val) {
                head->next = head->next->next;
            } else head=head->next;
        }
        return resHead;
    }
};

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

 

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]

 

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

 

示例:

输入: [2,1,5,6,2,3]
输出: 10
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(-1);
        int max_size=0;
        int index=0;
        stack<int> s;
 
        while(index<heights.size()){
            if(s.size()==0||heights[s.top()]<=heights[index]){
                s.push(index);
                index++;
            } else {
                int top=s.top();
                s.pop();
                int size=0; 
                if(s.size()==0) {
                    size=heights[top]*index;
                } else {
                    size=heights[top]*(index-s.top()-1);
                } 
                if(size>max_size) max_size=size;
            }
        } 
        return max_size;
    }
};

85. 最大矩形

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6
class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {  
        if(matrix.size()==0) return 0;     
        int* hist = new int[matrix[0].size()];  
        memset(hist, 0, sizeof(int)*matrix[0].size());    
        int max_ = 0;    
        for(int i=0; i<matrix.size(); i++){  
            for(int j=0; j<matrix[0].size(); j++){  
                if(matrix[i][j]=='1')  *(hist+j) += 1;  
                else  *(hist+j) = 0;  
            }    
            max_ = max(max_, maxRectInHistogram(hist, matrix[0].size()) );  
        }     
        return max_;  
    }   
    int maxRectInHistogram(int hist[], int n){      
        int max_ = hist[0]; 
        int j = 0, k = 0, temp =0;
        for(int i=0; i<n; i++){    
                j = i, k = i;
                while(j < n&&hist[j] >= hist[i])j++;
                while(k >= 0&&hist[k] >=hist[i])k--;
                temp = (j-k-2 + 1)*hist[i];
                max_ = max(temp,max_);
        }      
        return max_;    
    }    
};

(以上题目均摘自leetcode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值