Heaters(C++供暖器)

459 篇文章 1 订阅

解题思路:

首先吐槽下,原来给定的不是排序好的,按照我的思路还是要先排序的,哈哈哈,其实有点贪心算法的味道

(1)首先将两个都排序

(2)假设存在两个供暖器,i,j. 记落在ij之间距离i小于等于ij供暖器一半距离的房屋集合为H={h1,h2,...hn}

(3)剩下的就是距离j大于ij供暖器一半距离的房屋集合为G={g1,g2,...gm},设j到G的最大距离为j_front_max

(4)记i之前的供暖器为k,那么按照(3)求得i_front_max

(5)记i到H的最大距离为i_back_max

(6)供暖器i的供暖半径(贪心策略)i_max = max{i_front_max,i_back_max}

class Solution {
public:
    int findRadius(vector<int>& houses, vector<int>& heaters) {
    	sort(houses.begin(), houses.end());
        sort(heaters.begin(), heaters.end());
		
        int i=0,j=0,max=0;
		while(i<heaters.size()) {
			while(j<houses.size() && houses[j]<=heaters[i]) {
				if (heaters[i]-houses[j]>max) {
					max = heaters[i]-houses[j];
				}
				j++;
			}
			
			if (j<houses.size()) {
				if (i+1<heaters.size()) {
					while(j<houses.size() && houses[j]>heaters[i]) {
						if (houses[j]<=heaters[i+1]) {
							if (houses[j]-heaters[i] <= heaters[i+1]-houses[j]) {
								if (houses[j]-heaters[i]>max) {
									max = houses[j]-heaters[i];
								}
								j++;
							} else {
								i++;
								break;
							}
						} else {
							i++;
							break;
						}
					}

				} else {
					while(j<houses.size() && houses[j]>heaters[i]) {
						if (houses[j]-heaters[i]>max) {
							max = houses[j]-heaters[i];
						}
						j++;	
					}
					i++;
				}
			} else break;
			
		} 
		return max;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值