Welcome to Subscribe On Youtube

3631. Sort Threats by Severity and Exploitability 🔒

Description

You are given a 2D integer array threats, where each threats[i] = [IDi, sevi​, expi]

  • IDi: Unique identifier of the threat.
  • sevi: Indicates the severity of the threat.
  • expi: Indicates the exploitability of the threat.

The score of a threat i is defined as: score = 2 × sevi + expi

Your task is to return threats sorted in descending order of score.

If multiple threats have the same score, sort them by ascending ID​​​​​​​.

 

Example 1:

Input: threats = [[101,2,3],[102,3,2],[103,3,3]]

Output: [[103,3,3],[102,3,2],[101,2,3]]

Explanation:

Threat ID sev exp Score = 2 × sev + exp
threats[0] 101 2 3 2 × 2 + 3 = 7
threats[1] 102 3 2 2 × 3 + 2 = 8
threats[2] 103 3 3 2 × 3 + 3 = 9

Sorted Order: [[103, 3, 3], [102, 3, 2], [101, 2, 3]]

Example 2:

Input: threats = [[101,4,1],[103,1,5],[102,1,5]]

Output: [[101,4,1],[102,1,5],[103,1,5]]

Explanation:​​​​​​​

Threat ID sev exp Score = 2 × sev + exp
threats[0] 101 4 1 2 × 4 + 1 = 9
threats[1] 103 1 5 2 × 1 + 5 = 7
threats[2] 102 1 5 2 × 1 + 5 = 7

threats[1] and threats[2] have same score, thus sort them by ascending ID.

Sorted Order: [[101, 4, 1], [102, 1, 5], [103, 1, 5]]

 

Constraints:

  • 1 <= threats.length <= 105
  • threats[i] == [IDi, sevi, expi]
  • 1 <= IDi <= 106
  • 1 <= sevi <= 109
  • 1 <= expi <= 109
  • All IDi are unique

Solutions

Solution 1: Sorting

We can directly sort the array according to the requirements of the problem. Note that the score is a long integer, so we need to use long integers when comparing to avoid overflow.

The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$, where $n$ is the length of the array $\text{threats}$.

  • class Solution {
        public int[][] sortThreats(int[][] threats) {
            Arrays.sort(threats, (a, b) -> {
                long score1 = 2L * a[1] + a[2];
                long score2 = 2L * b[1] + b[2];
                if (score1 == score2) {
                    return Integer.compare(a[0], b[0]);
                }
                return Long.compare(score2, score1);
            });
            return threats;
        }
    }
    
  • class Solution {
    public:
        vector<vector<int>> sortThreats(vector<vector<int>>& threats) {
            sort(threats.begin(), threats.end(), [](const vector<int>& a, const vector<int>& b) {
                long long score1 = 2LL * a[1] + a[2];
                long long score2 = 2LL * b[1] + b[2];
                if (score1 == score2) {
                    return a[0] < b[0];
                }
                return score2 < score1;
            });
            return threats;
        }
    };
    
    
  • class Solution:
        def sortThreats(self, threats: List[List[int]]) -> List[List[int]]:
            threats.sort(key=lambda x: (-(x[1] * 2 + x[2]), x[0]))
            return threats
    
    
  • func sortThreats(threats [][]int) [][]int {
    	sort.Slice(threats, func(i, j int) bool {
    		score1 := 2*int64(threats[i][1]) + int64(threats[i][2])
    		score2 := 2*int64(threats[j][1]) + int64(threats[j][2])
    		if score1 == score2 {
    			return threats[i][0] < threats[j][0]
    		}
    		return score2 < score1
    	})
    	return threats
    }
    
    
  • function sortThreats(threats: number[][]): number[][] {
        threats.sort((a, b) => {
            const score1 = 2 * a[1] + a[2];
            const score2 = 2 * b[1] + b[2];
            if (score1 === score2) {
                return a[0] - b[0];
            }
            return score2 - score1;
        });
        return threats;
    }
    
    
  • impl Solution {
        pub fn sort_threats(mut threats: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
            threats.sort_by(|a, b| {
                let score1 = 2i64 * a[1] as i64 + a[2] as i64;
                let score2 = 2i64 * b[1] as i64 + b[2] as i64;
                if score1 == score2 {
                    a[0].cmp(&b[0])
                } else {
                    score2.cmp(&score1)
                }
            });
            threats
        }
    }
    
    

All Problems

All Solutions