# CSPT 19 Lecture 14 ## [Jewels and Stones](https://leetcode.com/problems/jewels-and-stones/) ``` class Solution: """ Understand jewels = "aA", stones = "aAAbbbb" jewels = "z", stones = "ZZ" Plan Brute-force For each stone, check if the stone is in the jewels string Keep track of how many stones are jewels return that count Hash-and-store Store each jewel in a set, then check if the stone is in that set """ def numJewelsInStones(self, jewels: str, stones: str) -> int: numJewels = 0 jewels = set(list(jewels)) for stone in stones: # O(n) if stone in jewels: # O(1) numJewels += 1 return numJewels ``` ## [How Many Numbers Are Smaller Than the Current Number](https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number/) ``` class Solution: """ Understand nums = [8,1,2,2,3] output = [4,0,1,1,3] nums = [1,1,1,1] output = [0,0,0,0] nums = [4,3,2,1] output = [3,2,1,0] nums = [1,2,3] output = [0,1,2] Plan Brute-force approach for each element, look at all other elements and count how many elements are less than it Runtime: O(n^2) Space: O(1) Sort, then store-and-hash Sort the input list, create a dictionary where element --> numElements that are smaller than it. The number of elements smaller, is the index of the current element (except duplicates). Go through original list again, and simply construct the resulting list using the values in the dictionary Runtime: O(nlogn) Space: O(n) """ def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: sortedNums = sorted(nums) # nlogn numMap = {} # map from number --> count of other numbers that are smaller than it for (i, num) in enumerate(sortedNums): if num not in numMap: numMap[num] = i res = [] for num in nums: res.append(numMap[num]) return res ```