データ構造とアルゴリズムの実装テクニック

データ構造

TreeSetで特定の値より大きい最初の要素を検索

TreeSet<Integer> treeSet = new TreeSet<>();
Integer targetValue = treeSet.higher(searchKey);

2次元配列の降順ソート

Arrays.sort(2dArray, (first, second) -> (second[0] - first[0]));

最小ヒープの実装

PriorityQueue<int[]> minHeap = new PriorityQueue<>((arr1, arr2) -> arr1[0] - arr2[0]);

文字列と文字配列の相互変換

char[] charArray = inputString.toCharArray();
Arrays.sort(charArray);
String sortedString = new String(charArray);

双方向キューの操作

Deque<Integer> doubleEndedQueue = new LinkedList<>();
doubleEndedQueue.peekLast();
doubleEndedQueue.pollLast();
doubleEndedQueue.peekFirst();
doubleEndedQueue.pollFirst();
doubleEndedQueue.offerFirst();
doubleEndedQueue.offerLast();

カスタムソートを持つ優先度付きキュー
最初の要素で降順、同じ場合は2番目の要素で降順
ラムダ式での実装

PriorityQueue<int[]> customPriorityQueue = new PriorityQueue<>((arr1, arr2) -> {
    if (arr1[0] != arr2[0]) {
        return arr2[0] - arr1[0];
    } else {
        return arr2[1] - arr1[1];
    }
});

PriorityQueue<int[]> customPriorityQueue2 = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] first, int[] second) {
                return first[0] != second[0] ? second[0] - first[0] : second[1] - first[1];
            }
            });

マップの反復処理

Iterator<Map.Entry<Character, Integer>> iterator = charCountMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Character, Integer> entry = iterator.next();
            Character key = entry.getKey();
            Integer value = entry.getValue();
        }

反復を使った中間順走査

List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
TreeNode currentNode = root;
while (currentNode != null || !stack.isEmpty()) {
    while (currentNode != null) {
        stack.push(currentNode);
        currentNode = currentNode.left;
    }
    currentNode = stack.pop();
    result.add(currentNode.value);
    currentNode = currentNode.right;
}
return result;

Javaの参照渡しの動作

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    boolean[] visited = new boolean[25];
    
    public List<List<Integer>> subsets(int[] nums) {
        List<Integer> tempList = new ArrayList<>();
        findAllSubsets(nums, tempList, 0);
        return result;
    }
    
    private void findAllSubsets(int[] nums, List<Integer> tempList, int index) {
        if (index == nums.length) {
            result.add(new ArrayList<>(tempList));
            return;
        }
        
        tempList.add(nums[index]);
        findAllSubsets(nums, tempList, index + 1);
        tempList.remove(tempList.size() - 1);
        findAllSubsets(nums, tempList, index + 1);
    }
}

タグ: Java データ構造 アルゴリズム TreeSet PriorityQueue

6月10日 18:00 投稿