LeetCode DayGreedy 알고리즘 4부
452. 풍선을 터뜨리기 위한 최소 화살표 수
XY 평면을 나타내는 평평한 벽에 몇 개의 구형 풍선이 테이프로 붙어 있습니다. 풍선은 2D 정수 배열 점으로 표시됩니다. 여기서 points[i] = [xstart, xend]는 수평 직경이 xstart와 xend 사이에 걸쳐 있는 풍선을 나타냅니다. 풍선의 정확한 y좌표를 모릅니다.
화살표는 x축을 따라 여러 지점에서 수직(양의 y 방향)으로 직접 발사될 수 있습니다. xstart <= x <= xend인 경우 xstart 및 xend가 있는 풍선은 x를 향해 발사된 화살에 의해 터집니다. 쏠 수 있는 화살의 수에는 제한이 없습니다. 쏜 화살은 무한히 위로 날아가며 경로에 있는 모든 풍선을 터뜨립니다.
배열 포인트가 주어지면 모든 풍선을 터뜨리기 위해 발사해야 하는 최소 화살 수를 반환합니다.
예 1:
입력: 포인트 = [[10,16],[2,8],[1,6],[7,12]]
출력: 2
설명: 풍선은 2개의 화살로 터뜨릴 수 있습니다:
- x = 6에서 화살을 쏘아 풍선 [2,8]과 [1,6]을 터뜨립니다.
- x = 11에서 화살을 쏘아 풍선 [10,16]과 [7,12]를 터뜨립니다. 예시 2:
입력: 포인트 = [[1,2],[3,4],[5,6],[7,8]]
출력: 4
설명: 풍선 1개당 화살 1개를 쏘아 총 4개의 화살을 쏘아야 합니다.
예시 3:
입력: 포인트 = [[1,2],[2,3],[3,4],[4,5]]
출력: 2
설명: 풍선은 2개의 화살로 터뜨릴 수 있습니다:
- x = 2에서 화살을 쏘아 풍선 [1,2]와 [2,3]을 터뜨립니다.
- x = 4에서 화살을 쏘아 풍선 [3,4]와 [4,5]를 터뜨립니다.
제약사항:
1 <= 포인트.길이 <= 105
포인트[i].길이 == 2
-2^31 <= xstart < xend <= 2^31 - 1
원본페이지
public int findMinArrowShots(int[][] points) { if(points.length == 0){ return 0; } Arrays.sort(points, (a,b) ->{ if(a[0] == b[0]){ return a[1] - b[1]; } return a[0] - b[0]; }); int arrow = 1; int start = points[0][0]; int end = points[0][1]; for(int i=0; i<points.length; i++){ if((points[i][0] >= start && points[i][0]<= end) || (end >=points[i][0] && end <= points[i][1])){ //Narrow the arrow point down if(points[i][0] > start && points[i][0] <= end){ start = points[i][0]; } if(points[i][1]>start && points[i][1] < end){ end = points[i][1]; } continue; }else{ // current arrow point is not satisfied with balloons start = points[i][0]; end = points[i][1]; arrow ++; } } return arrow; }
435. 겹치지 않는 간격
간격[i] = [starti, endi]인 간격의 배열이 주어지면 나머지 간격이 겹치지 않도록 제거해야 하는 최소 간격 수를 반환합니다.
예 1:
입력: 간격 = [[1,2],[2,3],[3,4],[1,3]]
출력: 1
설명: [1,3]은 제거할 수 있으며 나머지 간격은 겹치지 않습니다.
예시 2:
입력: 간격 = [[1,2],[1,2],[1,2]]
출력: 2
설명: 나머지 간격이 겹치지 않게 하려면 두 개의 [1,2]를 제거해야 합니다.
예시 3:
입력: 간격 = [[1,2],[2,3]]
출력: 0
설명: 이미 겹치지 않는 간격을 제거할 필요가 없습니다.
제약사항:
1 <= 간격.길이 <= 10^5
간격[i].길이 == 2
-5 * 10^4 <= 시작 < 엔디 <= 5 * 10^4
원본페이지
잘못된 코드
public int eraseOverlapIntervals(int[][] intervals) { if(intervals.length == 0){ return 0; } Arrays.sort(intervals, (a,b) ->{ if(a[0] == b[0]){ return a[1] - b[1]; } return a[0] - b[0]; }); Arrays.stream(intervals) .map(Arrays::toString) .forEach(System.out::println); int count = 0; // List<int[]> list = new LinkedList<>(); int start = intervals[0][0]; int end = intervals[0][1]; for(int i=1; i<intervals.length; i++){ //if the left edge is not included in the previous interval the right will definitely not be in it. if(intervals[i][0] >=start && intervals[i][0] <end){ count++; continue; } start = intervals[i][0]; end = intervals[i][1]; // list.add(intervals[i]); } return count; }
고치다
public int eraseOverlapIntervals(int[][] intervals) { if(intervals.length == 0){ return 0; } Arrays.sort(intervals, (a,b) ->{ return a[0] - b[0]; }); int count = 0; int start = intervals[0][0]; int end = intervals[0][1]; for(int i=1; i<intervals.length; i++){ if(intervals[i][0] < intervals[i-1][1]){ count++; // here we need to find the maximum overlap, the means whether the next element overlap to above groups of overlaps // if only find overlap from the previous interval, it may cause miss calculation over-add 1 count intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]); } } return count; }
763. 파티션 라벨
문자열 s가 주어졌습니다. 각 문자가 최대 한 부분에 나타나도록 문자열을 가능한 많은 부분으로 분할하려고 합니다.
모든 부분을 순서대로 연결한 후 결과 문자열은 s가 되도록 파티션이 수행되었습니다.
이 부품의 크기를 나타내는 정수 목록을 반환합니다.
예 1:
입력: s = "ababcbacadefegdehijhklij"
출력: [9,7,8]
설명:
파티션은 "ababcbaca", "defegde", "hijhklij"입니다.
각 문자가 최대 한 부분에 나타나도록 하는 파티션입니다.
"ababcbacadefegde", "hijhklij"와 같은 파티션은 s를 더 적은 부분으로 분할하므로 올바르지 않습니다.
예시 2:
입력: s = "eccbbbbdec"
출력: [10]
제약사항:
1 <= s.length <= 500
s는 영문 소문자로 구성됩니다.
원본페이지
public List<Integer> partitionLabels(String s) { List<Integer> list = new ArrayList<>(); Set<Character> set = new HashSet<>(); if(s.length() == 0){ return list; } int start = 0; int end = 0; for(int i=0; i<s.length(); i++){ Character target = s.charAt(i); if(!set.contains(target)){ set.add(target); int j = s.length()-1; for(;j>i;j--){ if(s.charAt(j) == target){ break; } } end = Math.max(end, j); } if(i == end){ list.add(end-start+1); start = i+1; set.clear(); } } return list; } </p> <pre class="brush:php;toolbar:false"> public List<Integer> partitionLabels(String s) { List<Integer> list = new ArrayList<>(); Set<Character> set = new HashSet<>(); int[] pos = new int[27]; for(int i=s.length()-1; i>0;i--){ if(pos[s.charAt(i)-'a'] == 0){ pos[s.charAt(i)-'a'] = i; } } if(s.length() == 0){ return list; } int start = 0; int end = 0; for(int i=0; i<s.length(); i++){ Character target = s.charAt(i); if(!set.contains(target)){ set.add(target); end = Math.max(end, pos[target-'a']); } if(i == end){ list.add(end-start+1); start = i+1; set.clear(); } } return list; }
public List<Integer> partitionLabels(String s) { List<Integer> list = new ArrayList<>(); int[] pos = new int[27]; for(int i=s.length()-1; i>0;i--){ if(pos[s.charAt(i)-'a'] == 0){ pos[s.charAt(i)-'a'] = i; } } if(s.length() == 0){ return list; } int start = 0; int end = 0; for(int i=0; i<s.length(); i++){ Character target = s.charAt(i); end = Math.max(end, pos[target-'a']); if(i == end){ list.add(end-start+1); start = i+1; } } return list; }
요소가 집합에 있었는지 평가하는 것은 중요하지 않기 때문에 끝에 도달했는지 여부에만 중점을 두고 동일한 요소가 발생하면 끝은 변경되지 않고 다른 요소가 병합되면, end가 변경될 수 있는 것처럼 보이지만 모두 if 평가에 영향을 미치지 않으므로 제거할 수 있습니다.
위 내용은 LeetCode DayGreedy 알고리즘 4부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

Redis 캐싱 솔루션은 제품 순위 목록의 요구 사항을 어떻게 인식합니까? 개발 과정에서 우리는 종종 a ... 표시와 같은 순위의 요구 사항을 처리해야합니다.
