1. 程式人生 > 實用技巧 >分割陣列為連續子序列- -貪心法

分割陣列為連續子序列- -貪心法

package Leetcode;

import java.util.ArrayList;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Iterator;

/**
 * 給你一個按升序排序的整數陣列 num(可能包含重複數字),請你將它們分割成一個或多個子序列,其中每個子序列都由連續整陣列成且長度至少為 3 。
 * 如果可以完成上述分割,則返回 true ;否則,返回 false 。
 
*/ public class fenge { public static void main(String[] args) { int []nums={0,1,2,3,3,4,5}; // int[] nums = { -5, -5, -4, -4, -3 }; System.out.println(isPossible(nums)); } /** * 這個只能到最長結尾 * @param nums * @return */ public static boolean isPossible1(int
[] nums) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { map.put(nums[i], map.get(nums[i]) + 1); } else { map.put(nums[i], 1); } }
int[] counts = new int[map.size()]; for (Integer i : map.keySet()) { counts[i - nums[0]] = map.get(i); } List<List<Integer>> list = new ArrayList<>(); while (map.size() != 0) { List<Integer> r = new ArrayList<>(); for (Integer i : map.keySet()) { if (map.get(i) == 0) { continue; } r.add(i); map.put(i, map.get(i) - 1); } Iterator<Entry<Integer, Integer>> it = map.entrySet().iterator(); while(it.hasNext()){ Entry<Integer, Integer> entry = it.next(); if(entry.getValue() == 0) it.remove();//使用迭代器的remove()方法刪除元素 } if(r.size()<3){ continue; } int flag=0; Collections.sort(r); for(int i=1;i<r.size();i++){ if(r.get(i)-r.get(i-1)!=1){ flag=1; break; } } if(flag==1){ continue; } list.add(r); } if(list.size()>=2){ return true; } return false; } /** * 思路:用tail記錄結束位置為i的序列個數 * 1.如果當前的後面兩個都存在,以後面第三個結尾+1 * 2.如果當前的前面一個結尾的長度不為0,把當前的附在前一個上 * 3.否則false */ public static boolean isPossible(int[] nums){ Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { map.put(nums[i], map.get(nums[i]) + 1); } else { map.put(nums[i], 1); } } Map<Integer,Integer> tail=new HashMap<Integer,Integer>(); for(int i:nums){ int count=map.getOrDefault(i, 0); if(count<=0){ continue; }else if(tail.getOrDefault(i-1, 0)>0){ map.put(i, count-1); tail.put(i-1, tail.get(i-1)-1); tail.put(i, tail.getOrDefault(i,0)+1); }else if(map.getOrDefault(i+1, 0)>0&&map.getOrDefault(i+2, 0)>0){ map.put(i,count-1); map.put(i+1,map.get(i+1)-1); map.put(i+2,map.get(i+2)-1); tail.put(i+2, tail.getOrDefault(i+2, 0)+1); }else{ return false; } } return true; } }