Welcome to Subscribe On Youtube

2659. Make Array Empty

Description

You are given an integer array nums containing distinct numbers, and you can perform the following operations until the array is empty:

  • If the first element has the smallest value, remove it
  • Otherwise, put the first element at the end of the array.

Return an integer denoting the number of operations it takes to make nums empty.

 

Example 1:

Input: nums = [3,4,-1]
Output: 5
Operation Array
1 [4, -1, 3]
2 [-1, 3, 4]
3 [3, 4]
4 [4]
5 []

Example 2:

Input: nums = [1,2,4,3]
Output: 5
Operation Array
1 [2, 4, 3]
2 [4, 3]
3 [3, 4]
4 [4]
5 []

Example 3:

Input: nums = [1,2,3]
Output: 3
Operation Array
1 [2, 3]
2 [3]
3 []

 

Constraints:

  • 1 <= nums.length <= 105
  • -10<= nums[i] <= 109
  • All values in nums are distinct.

Solutions

  • class BinaryIndexedTree {
        private int n;
        private int[] c;
    
        public BinaryIndexedTree(int n) {
            this.n = n;
            c = new int[n + 1];
        }
    
        public void update(int x, int delta) {
            while (x <= n) {
                c[x] += delta;
                x += x & -x;
            }
        }
    
        public int query(int x) {
            int s = 0;
            while (x > 0) {
                s += c[x];
                x -= x & -x;
            }
            return s;
        }
    }
    
    class Solution {
        public long countOperationsToEmptyArray(int[] nums) {
            int n = nums.length;
            Map<Integer, Integer> pos = new HashMap<>();
            for (int i = 0; i < n; ++i) {
                pos.put(nums[i], i);
            }
            Arrays.sort(nums);
            long ans = pos.get(nums[0]) + 1;
            BinaryIndexedTree tree = new BinaryIndexedTree(n);
            for (int k = 0; k < n - 1; ++k) {
                int i = pos.get(nums[k]), j = pos.get(nums[k + 1]);
                long d = j - i - (tree.query(j + 1) - tree.query(i + 1));
                ans += d + (n - k) * (i > j ? 1 : 0);
                tree.update(i + 1, 1);
            }
            return ans;
        }
    }
    
  • class BinaryIndexedTree {
    public:
        BinaryIndexedTree(int _n)
            : n(_n)
            , c(_n + 1) {}
    
        void update(int x, int delta) {
            while (x <= n) {
                c[x] += delta;
                x += x & -x;
            }
        }
    
        int query(int x) {
            int s = 0;
            while (x) {
                s += c[x];
                x -= x & -x;
            }
            return s;
        }
    
    private:
        int n;
        vector<int> c;
    };
    
    class Solution {
    public:
        long long countOperationsToEmptyArray(vector<int>& nums) {
            unordered_map<int, int> pos;
            int n = nums.size();
            for (int i = 0; i < n; ++i) {
                pos[nums[i]] = i;
            }
            sort(nums.begin(), nums.end());
            BinaryIndexedTree tree(n);
            long long ans = pos[nums[0]] + 1;
            for (int k = 0; k < n - 1; ++k) {
                int i = pos[nums[k]], j = pos[nums[k + 1]];
                long long d = j - i - (tree.query(j + 1) - tree.query(i + 1));
                ans += d + (n - k) * int(i > j);
                tree.update(i + 1, 1);
            }
            return ans;
        }
    };
    
  • from sortedcontainers import SortedList
    
    
    class Solution:
        def countOperationsToEmptyArray(self, nums: List[int]) -> int:
            pos = {x: i for i, x in enumerate(nums)}
            nums.sort()
            sl = SortedList()
            ans = pos[nums[0]] + 1
            n = len(nums)
            for k, (a, b) in enumerate(pairwise(nums)):
                i, j = pos[a], pos[b]
                d = j - i - sl.bisect(j) + sl.bisect(i)
                ans += d + (n - k) * int(i > j)
                sl.add(i)
            return ans
    
    
  • type BinaryIndexedTree struct {
    	n int
    	c []int
    }
    
    func newBinaryIndexedTree(n int) *BinaryIndexedTree {
    	c := make([]int, n+1)
    	return &BinaryIndexedTree{n, c}
    }
    
    func (this *BinaryIndexedTree) update(x, delta int) {
    	for x <= this.n {
    		this.c[x] += delta
    		x += x & -x
    	}
    }
    
    func (this *BinaryIndexedTree) query(x int) int {
    	s := 0
    	for x > 0 {
    		s += this.c[x]
    		x -= x & -x
    	}
    	return s
    }
    
    func countOperationsToEmptyArray(nums []int) int64 {
    	n := len(nums)
    	pos := map[int]int{}
    	for i, x := range nums {
    		pos[x] = i
    	}
    	sort.Ints(nums)
    	tree := newBinaryIndexedTree(n)
    	ans := pos[nums[0]] + 1
    	for k := 0; k < n-1; k++ {
    		i, j := pos[nums[k]], pos[nums[k+1]]
    		d := j - i - (tree.query(j+1) - tree.query(i+1))
    		if i > j {
    			d += n - k
    		}
    		ans += d
    		tree.update(i+1, 1)
    	}
    	return int64(ans)
    }
    
  • class BinaryIndexedTree {
        private n: number;
        private c: number[];
    
        constructor(n: number) {
            this.n = n;
            this.c = Array(n + 1).fill(0);
        }
    
        public update(x: number, v: number): void {
            while (x <= this.n) {
                this.c[x] += v;
                x += x & -x;
            }
        }
    
        public query(x: number): number {
            let s = 0;
            while (x > 0) {
                s += this.c[x];
                x -= x & -x;
            }
            return s;
        }
    }
    
    function countOperationsToEmptyArray(nums: number[]): number {
        const pos: Map<number, number> = new Map();
        const n = nums.length;
        for (let i = 0; i < n; ++i) {
            pos.set(nums[i], i);
        }
        nums.sort((a, b) => a - b);
        const tree = new BinaryIndexedTree(n);
        let ans = pos.get(nums[0])! + 1;
        for (let k = 0; k < n - 1; ++k) {
            const i = pos.get(nums[k])!;
            const j = pos.get(nums[k + 1])!;
            let d = j - i - (tree.query(j + 1) - tree.query(i + 1));
            if (i > j) {
                d += n - k;
            }
            ans += d;
            tree.update(i + 1, 1);
        }
        return ans;
    }
    
    

All Problems

All Solutions