<p>A transaction is possibly invalid if:</p>

<ul>
	<li>the amount exceeds <code>$1000</code>, or;</li>
	<li>if it occurs within (and including) <code>60</code> minutes of another transaction with the <strong>same name</strong> in a <strong>different city</strong>.</li>
</ul>

<p>You are given an array of strings <code>transaction</code> where <code>transactions[i]</code> consists of comma-separated values representing the name, time (in minutes), amount, and city of the transaction.</p>

<p>Return a list of <code>transactions</code> that are possibly invalid. You may return the answer in <strong>any order</strong>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> transactions = [&quot;alice,20,800,mtv&quot;,&quot;alice,50,100,beijing&quot;]
<strong>Output:</strong> [&quot;alice,20,800,mtv&quot;,&quot;alice,50,100,beijing&quot;]
<strong>Explanation:</strong> The first transaction is invalid because the second transaction occurs within a difference of 60 minutes, have the same name and is in a different city. Similarly the second one is invalid too.</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> transactions = [&quot;alice,20,800,mtv&quot;,&quot;alice,50,1200,mtv&quot;]
<strong>Output:</strong> [&quot;alice,50,1200,mtv&quot;]
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> transactions = [&quot;alice,20,800,mtv&quot;,&quot;bob,50,1200,mtv&quot;]
<strong>Output:</strong> [&quot;bob,50,1200,mtv&quot;]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>transactions.length &lt;= 1000</code></li>
	<li>Each <code>transactions[i]</code> takes the form <code>&quot;{name},{time},{amount},{city}&quot;</code></li>
	<li>Each <code>{name}</code> and <code>{city}</code> consist of lowercase English letters, and have lengths between <code>1</code> and <code>10</code>.</li>
	<li>Each <code>{time}</code> consist of digits, and represent an integer between <code>0</code> and <code>1000</code>.</li>
	<li>Each <code>{amount}</code> consist of digits, and represent an integer between <code>0</code> and <code>2000</code>.</li>
</ul>

class Solution:
    def invalidTransactions(self, transactions: List[str]) -> List[str]:

        map = defaultdict(list)
        res = set()

        parsed_transactions = []
        for i, transaction in enumerate(transactions):
            name, time, amount, city = transaction.split(",")
            parsed_transactions.append((name, int(time), int(amount), city, i, transaction))

        for transaction in parsed_transactions:
            name, time, amount, city, i, original = transaction

            if amount > 1000:
                res.add(transaction)
            
            prevTrans = map[name]
            for i in range(len(prevTrans) - 1, -1, -1):
                otherName, otherTime, otherAmount, otherCity, otherIndex, otherOriginal = prevTrans[i]
                if otherCity != city and abs(otherTime - time) <= 60:
                    res.add(prevTrans[i])
                    res.add(transaction)
            map[name].append(transaction)

        return [trans[-1] for trans in res]

        # nameDict = defaultdict(list) # name : time, amount, city
        # invalid = set()
        # for txn in transactions:
        #     name, time, amount, city = txn.split(",")
        #     nameDict[name].append((int(time), int(amount), city, txn))
        
        # for name in nameDict:
        #     nameDict[name].sort()
        
        # print(nameDict)
        # for name in nameDict:
        #     for i, cur in enumerate(nameDict[name]):
        #         time, amount, city, txn = cur
        #         if amount > 1000:
        #             invalid.add((txn, i))
        #             continue
                
        #         left = i - 1
        #         while left >= 0:
        #             other_time, other_amount, other_city, other_txn = nameDict[name][left]
        #             if abs(time - other_time) > 60:
        #                 break
        #             if txn == other_txn or (other_city != city and other_amount <= 1000):
        #                 invalid.add((txn, i))
        #                 invalid.add((other_txn, left))
        #             left -= 1
        
        # return list(txn for txn, idx in invalid)
                




                # 10, 10, A
                # 20, 20, B
                # 30, 30, A
                # 40, 40, A




        
92