LeetCode で1051. Height Checkerという問題を解いています。
Example 1
Input: heights = [1,1,4,2,1,3]
Output: 3
Explanation:
heights: [1,1,4,2,1,3]
expected: [1,1,1,2,3,4]
Indices 2, 4, and 5 do not match.
Example 2
Input: heights = [5,1,2,3,4]
Output: 5
Explanation:
heights: [5,1,2,3,4]
expected: [1,2,3,4,5]
All indices do not match.
Example3
Input: heights = [1,2,3,4,5]
Output: 0
Explanation:
heights: [1,2,3,4,5]
expected: [1,2,3,4,5]
All indices match.
という風に与えられた配列(Input heights)に対して、その配列が昇順で並べられた時と、元の配列とを比較して値が違う箇所の個数をOutputとして出力しろ、という問題です。
これをArraysortを使わずHashMapで行いたいのですが、いまいちうまく行っておりません。
Twoポインターの使い方が良くないのだと思いますが、どのように書くべきでしょうか。
java
1class Solution { 2 public int heightChecker(int[] heights) { 3 Map<Integer, Integer> map = new HashMap<>(); 4 5 for(int i = 0; i< heights.length; i++){ 6 map.put(heights[i], map.getOrDefault(heights[i], 0) + 1); 7 } 8 9 int result = 0; 10 List keys = new ArrayList(map.keySet()); 11 12 for (int i = 0, curHeight = 0 ; curHeight < heights.length ; curHeight++) { 13 if(map.get((int)keys.get(i)) > 0) { 14 if(heights[curHeight] != (int)keys.get(i)){ 15 result++; 16 } 17 map.put((int)keys.get(i), map.get((int)keys.get(i)) - 1); 18 }else{ 19 i++; 20 } 21 } 22 return result; 23 } 24}
回答例として以下のようなコードがあり、こちらではint[101]を使っているのですが、上記では以下と同じことをHashMapで行いたいと考えております。
java
1class Solution { 2 public int heightChecker(int[] heights) { 3 int[] heightToFreq = new int[101]; 4 5 for (int height : heights) { 6 heightToFreq[height]++; 7 } 8 9 int result = 0; 10 int curHeight = 0; 11 12 for (int i = 0; i < heights.length; i++) { 13 while (heightToFreq[curHeight] == 0) { 14 curHeight++; 15 } 16 17 if (curHeight != heights[i]) { 18 result++; 19 } 20 heightToFreq[curHeight]--; 21 } 22 23 return result; 24 } 25}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/20 21:54